将两个LINQ查询合并为一个

时间:2012-03-21 12:41:48

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

我有一个包含大约15个不同字段的表,其中一些是JobID(整数字段),Cost(整数字段)和LastUpdated(DateTime字段)

JobID  Cost      LastUpdated
 1      10        10-July-2011
 1      15        11-June-2011
 2      25        5-May-2011
 1      15        12-April-2011

是否可以编写一个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个不同的表。在将sum和LastUpdated日期组合在一个查询中时,我试图将该命中数减少到9,每个表一个。

感谢您的时间......

2 个答案:

答案 0 :(得分: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) } );

答案 1 :(得分:2)

是的,你可以这样做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),
            };