2010-10-02 33 views
68

我看到這個代碼工作,LINQ到SQL,但是當我使用實體框架,它拋出這個錯誤:方法不能被翻譯成店表達

LINQ to Entities does not recognize the method 'System.Linq.IQueryable'1[MyProject.Models.CommunityFeatures] GetCommunityFeatures()' method, and this method cannot be translated into a store expression.`

的庫代碼是這樣的:

public IQueryable<Models.Estate> GetEstates() 
{ 
    return from e in entity.Estates 
      let AllCommFeat = GetCommunityFeatures() 
      let AllHomeFeat = GetHomeFeatures() 
      select new Models.Estate 
         { 
           EstateId = e.EstateId, 
           AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat), 
           AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat) 
         }; 
} 

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures() 
{ 
    return from f in entity.CommunityFeatures 
      select new CommunityFeatures 
         { 
          Name = f.CommunityFeature1, 
          CommunityFeatureId = f.CommunityFeatureId 
         }; 
} 

public IQueryable<Models.HomeFeatures> GetHomeFeatures() 
{ 
    return from f in entity.HomeFeatures 
      select new HomeFeatures() 
      { 
       Name = f.HomeFeature1, 
       HomeFeatureId = f.HomeFeatureId 
      }; 
} 

LazyList是一個擴展IQueryable功能的List。

有人可以解釋爲什麼會發生此錯誤嗎?

回答

96

原因: 根據設計,LINQ to Entities需要整個LINQ查詢表達式轉換爲服務器查詢。在翻譯查詢之前,只有少數不相關的子表達式(查詢中的表達式不依賴於服務器的結果)在客戶端上進行評估。沒有已知翻譯的任意方法調用,例如GetHomeFeatures()在這種情況下不受支持。
更具體地說,LINQ to Entities只支持無參數構造函數初始化程序

解決方案: 因此,要克服這個例外,你需要你的子查詢合併到主之一GetCommunityFeatures()GetHomeFeatures()而不是從LINQ查詢中直接調用方法。此外,您嘗試使用其參數化構造函數實例化一個新實例LazyList,就像您在LINQ to SQL中所做的一樣。爲此,解決方案將切換到客戶端評估LINQ查詢(LINQ到對象)。這將要求您在調用LazyList構造函數之前調用您的LINQ to Entities查詢的AsEnumerable方法。

像這樣的東西應該工作:

public IQueryable<Models.Estate> GetEstates() 
{ 
    return from e in entity.Estates.AsEnumerable() 
     let AllCommFeat = from f in entity.CommunityFeatures 
         select new CommunityFeatures { 
          Name = f.CommunityFeature1, 
          CommunityFeatureId = f.CommunityFeatureId 
         }, 
     let AllHomeFeat = from f in entity.HomeFeatures 
         select new HomeFeatures() { 
          Name = f.HomeFeature1, 
          HomeFeatureId = f.HomeFeatureId 
         }, 
     select new Models.Estate { 
      EstateId = e.EstateId, 
      AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat), 
      AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat) 
     }; 
} 


更多信息:請看看LINQ to Entities, what is not supported?獲取更多信息。 也可以查看LINQ to Entities, Workarounds on what is not supported瞭解可能的解決方案的詳細討論。 (這兩個鏈接都是緩存版本,因爲原始網站已關閉)

相關問題