2012-11-24 34 views
8

我正在使用.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查詢或其他)?

回答

8

它更易於使用EntityFunctions *這裏:

var result = 
    from query in DbManager.GetTable<SomeTableModel>() 
    group query by EntityFunctions.TruncateTime(query.CreationDate) 
    into list1 
    select list1; 

* DbFunctions作爲實體框架6.

+0

我想它應該工作。但是BLToolkit失敗了。 異常消息: _'TruncateTime(Convert(selectParam.CreationDate))'無法轉換爲SQL._ 而堆棧跟蹤: _在BLToolkit.Data.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext上下文,表達式表達式,布爾解開)_ 我應該考慮如何以另一種方式實現過濾器的UI。 – colotiline

+0

在EF中,它轉換爲'convert(datetime,convert(varchar(255),[DateField],102),102))''。你能用它在BLT中創建一些功能嗎?我不清楚BLT和EF如何合作。可悲的是,BLT文檔非常糟糕。 –

+0

我試圖實現我自己的比較器。它也失敗了。它總是嘗試優化查詢並失敗。 但我用另一個用戶界面和一種方式來過濾數據,現在一切正常。 – colotiline

2

更新的回答:EntityFunctions得到了棄用。

警告1'System.Data.Entity.Core.Objects.EntityFunctions'已過時:'該類已被System.Data.Entity.DbFunctions替換。' C:\用戶\六法\文件\的Visual Studio 2013 \項目\ MatasMrLenderTest \ Mvc5MobileApplication1 \控制器\ CreditScoreController.cs 32 103 Mvc5MobileApplication1

現在是DbFunctions

using System.Data.Entity; 

var result = DbManager.GetTable<SomeTableModel>() 
.GroupBy(o => DbFunctions.TruncateTime(o.CreationDate))