我正在使用.NET和實體框架。 我想按照沒有時間部分的日期對錶格進行分組。按日期實體框架組並返回新類
我已經得到了類:
public sealed class QueryItem {
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
與方法(我使用的是BLToolkit,如果你想知道什麼是DbManager):
protected override IQueryable<QueryItem> InitiateQuery() {
return
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select new QueryItem {Year = list1.Key.Year, Month = list1.Key.Month, Day = list1.Key.Day};
}
在這種方法中LINQ翻譯成這個SQL查詢:
SELECT
[query].[CreationDate]
FROM
[SomeDatabase.SomeTable] [query]
GROUP BY
DatePart(Year, [query].[CreationDate]),
DatePart(Month, [query].[CreationDate]),
DatePart(Day, [query].[CreationDate]),
[query].[CreationDate]
而這是錯誤的查詢,因爲它不會只按日期分組。
但是,如果我用這個代碼(這是不可用的,我需要返回一個類對象):
var result =
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select list1;
它將被翻譯成這樣:
SELECT
[t1].[c1] as [c11],
[t1].[c2] as [c21],
[t1].[c3] as [c31]
FROM
(
SELECT
DatePart(Year, [selectParam].[CreationDate]) as [c1],
DatePart(Month, [selectParam].[CreationDate]) as [c2],
DatePart(Day, [selectParam].[CreationDate]) as [c3]
FROM
[SomeDatabase.SomeTable] [selectParam]
) [t1]
GROUP BY
[t1].[c1],
[t1].[c2],
[t1].[c3]
這是正確的查詢。
我想實體框架試圖優化我的查詢或類似的東西,這就是爲什麼我有錯誤的查詢。
我對不對? 我是以正確的方式來做的嗎? 我該怎麼做(也許使用直接的SQL查詢或其他)?
我想它應該工作。但是BLToolkit失敗了。 異常消息: _'TruncateTime(Convert(selectParam.CreationDate))'無法轉換爲SQL._ 而堆棧跟蹤: _在BLToolkit.Data.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext上下文,表達式表達式,布爾解開)_ 我應該考慮如何以另一種方式實現過濾器的UI。 – colotiline
在EF中,它轉換爲'convert(datetime,convert(varchar(255),[DateField],102),102))''。你能用它在BLT中創建一些功能嗎?我不清楚BLT和EF如何合作。可悲的是,BLT文檔非常糟糕。 –
我試圖實現我自己的比較器。它也失敗了。它總是嘗試優化查詢並失敗。 但我用另一個用戶界面和一種方式來過濾數據,現在一切正常。 – colotiline