2010-07-20 89 views
3

我想执行一个Linq to Sql语句来捕获(过滤的)数据集中的计数和平均值。我有什么工作,但它需要对数据库进行两次查询,以便在一个查询中可以进行查询。Linq to Sql用于对一组数据进行计数和平均(无分组)

有趣的是,当我使用group by子句时,可以发出一个查询。

例如:

select count(*), avg(duration) from events 

我的LINQ看起来是这样的:

var x = from e in db.events 
     select e; 
x = from i in x 
    where i.NAME == "foo" 
    select i; 

return new { 
    count = x.Count(), 
    avgDuration = x.Average(e => e.Duration) 
    }; 

与该代码,我得到两个查询:

SELECT AVG([t0].[DURATION]) AS [value] FROM [dbo].[EVENTS] AS [t0] 

SELECT COUNT(*) AS [value] FROM [dbo].[EVENTS] AS [t0] 

还有别的办法吗?

+0

从你给它看起来像你只会得到一个代码有2列(count,avgDuration)的行是期望的结果吗? – Kumu 2010-07-20 23:45:51

+0

是的,它的表快速快照 - 高查询率(用于仪表板图) – Gavin 2010-07-21 00:44:46

回答

7

我能得到的最好的是一个嵌套子查询:

var x = from e in db.events 
     group e by 1 into grp 
     select new { 
      count = grp.Count(), 
      avgDuration = grp.Average(x => x.Duration) } 

根据LINQPad,这将输出的SQL:

DECLARE @p0 Int = 1 

SELECT COUNT(*) AS [count], AVG([t1].[Amount]) AS [avgDuration] 
FROM (
    SELECT @p0 AS [value], [t0].[Duration] 
    FROM Events AS [t0] 
    ) AS [t1] 
GROUP BY [t1].[value] 
+0

哇,linq永远不会惊讶我可以做什么,用于获取它的SQL和制作有趣的代码来获得工作完成 +1 – Gavin 2010-07-21 00:46:18