【问题标题】:Combining two LINQ queries into one将两个 LINQ 查询合并为一个
【发布时间】:2012-03-21 12:41:47
【问题描述】:

我有一个大约有 15 个不同字段的表,其中一些是 JobID(整数字段)、Cost(整数字段)和 LastUpdated(日期时间字段)

JobID 成本 LastUpdated 1 10 2011 年 7 月 10 日 1 15 2011 年 6 月 11 日 2 25 2011 年 5 月 5 日 1 15 2011 年 4 月 12 日

是否可以编写一个 LINQ 查询来获取作业 id = 1 的成本总和以及产生此类成本的最后日期?

上面示例数据的示例查询输出如下所示:

40 , 10-july-2011

目前我正在使用这样的两个不同的 linq 查询来执行此操作,在这种特殊情况下,会导致网站对数据库的两次点击。

//for last updated
(from row in MyTable where row.JobID == 1
 orderby row.LastUpdated descending
 select row.LastUpdated).First()

//for sum of cost
(from row in MyTable  
 where row.JobID == 1
 select row.Cost).Sum()

在这种情况下,一个 linq 查询会更好吗?在整个页面加载过程中,类似的情况会导致对数据库的多次点击,总共约 18 次,对 9 个不同的表。在一个查询中结合总和和 LastUpdated 日期时,我试图将命中数减少到 9,每个表一个。

感谢您的宝贵时间...

【问题讨论】:

    标签: .net linq entity-framework linq-to-entities


    【解决方案1】:

    是的,你可以这样做 group by 像这样

    var query = from row in MyTable
                group row by row.JobID into rows
                where rows.Key == 1 
                select new
                {
                  LastUpdated = rows.Select(x => x.LastUpdated).OrderByDescending(x => x).First(),
                  Cost = rows.Sum(x => x.Cost),
                };
    

    【讨论】:

    • 我在 linqpad 中试过这个 .. 并得到一个错误:方法 'OrderByDescending' 没有重载需要 0 个参数。
    • 但是我改变的这一行成功了.. LastUpdated = rows.OrderByDescending(x => x.LastUpdated).First().LastUpdated
    • @user20358 - 抱歉,我已更新为 .OrderByDescending(x => x),它现在应该适合您。你的台词也不错。
    【解决方案2】:

    你可以用这个:

    MyTable.Where(x => x.JobID == 1)
           .OrderByDescending(x => x.LastUpdated)
           .GroupBy(x => x.JobID)
           .Select(x => new { LastUpdated = x.First().LastUpdated, 
                              Sum = x.Sum(y => y.Cost) } );
    

    【讨论】:

    • 感谢 Daniel 的快速回复,并不是说粗鲁,只是为了让我理解这个查询比 Aducci 给出的查询更好吗?我在 SQL 探查器中都运行了它们,它们似乎都消耗了相同数量的 cpu 和时间。然而,他的查询对我来说似乎更易读,来自 SQL 背景。这是编写 Linq 查询的更好方法,还是我应该使用我认为更具可读性的方法。同样,我并不是要粗鲁或质疑您的知识。这只是为了我的理解......谢谢:)
    • @user20358:答案应该是相同的。我个人不喜欢查询语法并且觉得它很难阅读,这就是我使用方法链的原因。这是个人喜好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多