我目前正在解決一個問題,我想運行一個查詢,並根據所選日期對結果進行分組。Linq - 按日期分組和計數
在這個例子中,假設一個簡單的模型,像這樣:
public class User
{
public DateTime LastLogIn {get; set;}
public string Name {get; set;}
}
我正在尋找解決的辦法是讓用戶的計數登錄的日期。 在數據庫中,DateTime與日期和時間組件一起存儲,但對於此查詢,我真的只關心日期。
我現在有這就是:
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)EntityFunctions.TruncateTime(x.Key)
}).ToList();
以上但返回一個空列表。
的最終目標是有對象的列表,其中包含一個值(用戶數登錄的某一天)和天(當日有問題)
有什麼想法?
在改變查詢:
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)x.Key
}).ToList();
現在返回一個單一的項目列表,取值爲where子句匹配用戶的總數,以及日是第一天。它似乎還沒有能夠按天分組
注意:原來上面的代碼是正確的,我只是在做別的錯誤。
的Sql,它是生成的(注意可能是很輕微的語法錯誤在這裏與我調整它的例子):
SELECT
1 AS [C1],
[GroupBy1].[A1] AS [C2],
CAST([GroupBy1].[K1] AS datetime2) AS [C3]
FROM (SELECT
[Filter1].[K1] AS [K1],
COUNT([Filter1].[A1]) AS [A1]
FROM (SELECT
convert (datetime2, convert(varchar(255), [Extent1].[LastLogIn], 102) , 102) AS [K1],
1 AS [A1]
FROM [dbo].[Users] AS [Extent1]
WHERE (([Extent1].[LastLogIn] >= @p__linq__1) AND ([Extent1].[LastLogIn] <= @p__linq__2)
) AS [Filter1]
GROUP BY [K1]
) AS [GroupBy1]
該查詢看起來OK。當你用'Count()'代替'GroupBy'時,你會得到一個非零值嗎? – dasblinkenlight
用直計數運行返回計數預期匹配where子句,它似乎是分組正在殺死它 – Thewads
您是否嘗試用'Day ='替換'Day =(DateTime)EntityFunctions.TruncateTime(x.Key)'' x.Key'?它應該是相同的,因爲日期已被截斷用於分組。 – dasblinkenlight