2011-04-01 52 views
0

我已經創建了下面的函數來獲取日期差:LINQ的靜態方法錯誤

public static double MonthsDifference(DateTime dtStart, DateTime dtNow) 
    { 
     DateTime start = dtStart; 
     DateTime end = dtNow; 
     int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12); 
     double daysInEndMonth = (end - end.AddMonths(1)).Days; 
     double months = compMonth + (start.Day - end.Day)/daysInEndMonth; 
     return months; 
    } 

我使用它在我的LINQ查詢

var query = from c in context.AccountOwners.Where(MonthsDifference(p.Account.StateChangeDate,DateTime.Now) < 4) 
         select c; 
      return query.Count(); 

,但它給錯誤:

LINQ實體無法識別方法'Double MonthsDifference(System.DateTime,System.DateTime)'方法,並且此方法無法轉換爲商店表達式。

請建議的解決方案

+0

首先。你可以在linq中創建和使用函數來調用實體。然而,從我的研究結果來看,只有在您嘗試使用相同類的方法中聲明該方法時纔有效。第二個是 – Michael 2014-05-24 01:39:34

+0

。使用日期/時間函數的內置實體函數。 – Michael 2014-05-24 01:39:57

回答

1

MonthsDifference功能不能被映射到SQL,這就是爲什麼你收到此錯誤。您需要重寫查詢表達式,而無需調用您自己的方法來做您想做的事(這可能是不可能的 - 我不清楚LINQ to Sql支持哪些本地數據庫函數),獲取結果集並在本地執行過濾。

後一種方法會是這樣的:

var count = context.AccountOwners.ToArray() 
     .Count(o => MonthsDifference(p.Account.StateChangeDate,DateTime.Now) < 4); 
1

如果你想這樣做的LINQ的,那麼你需要內嵌這個方法,以便LINQ2SQL可以把它翻譯成SQL。

所以,我想你會需要這樣的東西:

var start = DateTime.Now; 
var query = from c in context.AccountOwners 
      let accountDate = c.Account.StateChangeDate 
      let diff = (start.Month + start.Year * 12) - (accountDate.Month + accountDate.Year * 12) + ... 
      where diff < 4 
      select c; 

return query.Count(); 

Months difference between dates

1

在LINQ到實體您可以使用Entity functions

using System.Data.Objects; 

var query = from c in context.AccountOwners.Where(EntityFunctions.DiffMonths(
          p.Account.StateChangeDate,DateTime.Now) < 4) 
      select c; 
return query.Count();