2010-10-02 32 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了解可能的解决方案的详细讨论。 (这两个链接都是缓存版本,因为原始网站已关闭)

相关问题