使用 Entity Framework 仅计算值的 LINQ 查询

Posted

技术标签:

【中文标题】使用 Entity Framework 仅计算值的 LINQ 查询【英文标题】:LINQ query for just computed values with Entity Framework 【发布时间】:2014-02-14 14:57:19 【问题描述】:

构建仅包含行数和存在性检查的查询的最佳方法是什么?这是我目前所做的:

var fruitSummary = (
    from _ in db.Apples
    select new 
        GreenAppleCount = db.Apples.Count(a => a.Color == "Green"),
        Yuck = db.Bananas.Any(b => b.Age > 10)
    ).First();

这个结构符合我对数据库进行一次调用的主要目标,但似乎应该有一种更简洁的方式来表达它。请注意 from 子句中的 _ in db.Apples 未使用。它可能是_ in db.Wildebeests,并且会产生相同的查询。有没有办法避免未使用的表引用?

【问题讨论】:

【参考方案1】:

想到的最“明智”的选择是创建一个存储过程来计算从 EF 调用的两个值。当您希望在单个数据库往返中“做多项事情”时,这可以是一个选项。

【讨论】:

那行得通。不幸的是,它与许多 LINQ 的特性不兼容,例如编译时类型检查、重构和 IDE 导航。另外,您需要编写和部署存储过程,如果您使用的是 EF Code First,这会很麻烦。【参考方案2】:

关于查询的最佳写作方式是

     var output = Enumerable.Range(0, 1).Select(o => 
              new 
                 GreenAppleCount = db.Apples.Count(a => a.Color == "Green"),
                 Yuck = db.Bananas.Any(b => b.Age > 10
                  );

【讨论】:

与 OP 的代码不同,这无法满足仅执行一个数据库查询的主要目标。 我的答案就是以优化的方式编写代码。查询的迭代取决于表 Apples 中的行数,如果苹果包含 1000 行,您的代码将被执行 1000 次。除非苹果和香蕉有关系,否则无法对 DB 进行单次点击。 1) 这不是我的问题 2) 这绝不是优化的,事实上,它比问题中的代码显着更糟糕,因为它执行两个单独的往返到数据库,而不仅仅是一个。 @slash 为了澄清一个误解,无论 Apples 和 Bananas 之间的关系如何,问题中的查询都会进行一次数据库调用。即使表完全不相关,LINQ 查询也会转换为单个 SELECT 语句,在单个调用中传递到数据库。

以上是关于使用 Entity Framework 仅计算值的 LINQ 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有 EntityState 和值的查询从 Entity Framework 5 转换为 6?

为啥 Entity Framework Raw Sql Query 从 MySql 返回具有不需要值的对象?

Entity Framework 6.2.0 - 自动保存哪个用户创建或更新了 DbSet 值的 DbContext

C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?

Entity Framework 6 DB-First:仅针对 SQL Server 发出 InvalidOperationException

Entity Framework Core 是如何根据实体类生成模型的?