3

我已經使用POCO's將RIA Services與實體框架相結合。這一切都很奇妙(比LINQ to SQL更好)。我的問題是與下面的代碼段:爲什麼我不能使用`TimeSpan.FromMinutes`在RIA中投影`TimeSpan`?

[Query] 
public IQueryable<MyEntity> GetMyEntities() 
{ 
    return from myEntity in ObjectContext.MyEntities 
      where myEntity.Status != "deleted" 
      select new MyEntity 
      { 
       // Other property assignments... 

       SuchAndSuchTime = TimeSpan.FromMinutes(project.SuchAndSuchTime ?? 0.0), 

       // Other property assignments... 
      }; 
} 

這是我的代碼的版本,其中名稱已被更改,以保護無辜。這編譯查找,但我得到以下例外時,我運行它:

加載操作失敗,查詢'GetMyEntities'。 LINQ到實體不 不能識別方法「System.TimeSpan FromMinutes(雙)」方法,並 這種方法不能被翻譯成表達商店。

爲什麼我不能這樣做,是否有解決方法?

+0

我會在默認情況下,如果我必須接受這一點,但我真的很想抱出了一個更好的答案。謝謝:) – Jordan 2012-01-12 18:58:41

+0

Windows Server 2008. – Jordan 2012-01-12 19:46:37

+0

答覆已發佈... – 2012-01-12 20:03:56

回答

4

的這裏的問題是,CLR時間跨度類沒有在LINQ到實體完整規範的映射。這是你的例外是指子句中的「...不能被翻譯成店表達......」

對於LINQ方案中,對實體框架的查詢涉及映射某些CLR方法的方法基礎數據源通過規範函數。 LINQ to Entities查詢中任何未明確映射到規範函數的方法調用都將導致引發運行時NotSupportedException異常。

來源:MSDN

時間跨度是這些案件之一。

至少有兩種解決方案,而這些都是......

  1. 使用有效的LINQ到SQL(即,規範的方法只)語句來獲得全套從數據庫的結果;然後使用LINQ to Objects來過濾返回的結果。 LINQ to Objects過濾器應包含所有非規範方法,以便您的過濾可傳遞預期的數據子集。

  2. 疏散非規範的方法來存儲過程(即,轉換爲直SQL),並調用存儲過程。

第三種解決辦法是嘗試和包裹非經典表情到您的域服務類的私有方法。這是我在做出這個難以捉摸的例外的底部之前所做的。

第四,更加隱晦的方式,給出here

1

我想這可能是固定在EF 4.2,但我不認爲這是公開發布。

但底線是加里是正確的。

相關問題