2013-04-12 67 views
6

的實體組我使用下面的代碼使用ASP.NET V4.5和LINQ to實體 我想我的組數據按周LINQ到按週數

var groupedByWeek = salesOrdersList 
    .GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek)); 

但是我得到一個「死亡的黃色屏幕」,出現錯誤:

LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.

我非常希望把

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber); 

但生活並不那麼容易!

有誰知道使用Linq to Entities的週數的方法嗎?

+0

什麼是與它的問題呢? –

+0

LINQ to Entities不識別方法'System.DateTime AddDays(Double)'方法,並且此方法不能轉換爲存儲表達式。 –

+0

如果將其更改爲「i => i.DueDate - TimeSpan.FromDays(i.DueDate.DayOfWeek)'或'i => i.DueDate - new TimeSpan(i.DueDate.DayOfWeek,0,0,0 )'? –

回答

14

使用SqlFunctions.DatePart()方法:

var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate)); 

這將增加DATEPART SQL函數調用到生成的SQL查詢。

0

或者您可以獲取當週的第一天的日期,然後在該日期之前分組。

獲取本週第一天的日期。 您可以使用此代碼:

public static class DateTimeExtensions 
{ 
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 
     return dt.AddDays(-1 * diff).Date; 
    } 
} 

那麼你可以在本週這樣的第一次約會組:

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.StartOfWeek(DayOfWeek.Monday)); 
+0

嗯,我喜歡這個解決方案,但我得到這個錯誤:r System.NotSupportedException:LINQ to Entities不能識別方法'System.DateTime StartOfWeek(System.DateTime,System.DayOfWeek)'方法,並且此方法不能轉換爲商店表達。 – Rodney

+0

是的,你是對的。 我認爲這個解決方案是使用'SqlFunctions' 像@ MarcinJuraszek的解決方案: 'VAR groupedByWeek = salesOrdersList.GroupBy(I => SqlFunctions.DatePart( 「周」,i.DueDate));' 因爲這個功能可以轉換成這個常規的SQL代碼 'SELECT * From T GROUP BY DATEPART(wk,T.Date)' – hoss77