2010-07-20 64 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