【问题标题】:LINQ query for just computed values with Entity Framework使用 Entity Framework 仅计算值的 LINQ 查询
【发布时间】: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,并且会产生相同的查询。有没有办法避免未使用的表引用?

【问题讨论】:

    标签: c# entity-framework linq-to-entities


    【解决方案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 语句,在单个调用中传递到数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多