【问题标题】:Method cannot be translated into a store expression方法无法转换为存储表达式
【发布时间】:2011-04-20 06:57:39
【问题描述】:

我看到这段代码与 LINQ to SQL 一起工作,但是当我使用实体框架时,它会抛出这个错误:

LINQ to Entities 无法识别方法 'System.Linq.IQueryable'1[MyProject.Models.CommunityFeatures] GetCommunityFeatures()' 方法,并且该方法无法转换为存储表达式。`

仓库代码是这样的:

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。

有人能解释一下为什么会出现这个错误吗?

【问题讨论】:

    标签: c# entity-framework linq-to-entities repository-pattern


    【解决方案1】:

    原因: 根据设计,LINQ to Entities 需要将整个 LINQ 查询表达式转换为服务器查询。在翻译查询之前,只有少数不相关的子表达式(查询中不依赖于服务器结果的表达式)在客户端上进行评估。不支持没有已知转换的任意方法调用,例如本例中的 GetHomeFeatures()。
    更具体地说,LINQ to Entities 仅支持 无参数构造函数Initializers

    解决方案: 因此,要克服此异常,您需要将子查询合并到 GetCommunityFeatures()GetHomeFeatures() 的主查询中,而不是直接从 LINQ 查询中调用方法.此外,在您尝试使用其参数化构造函数实例化 LazyList 的新实例的行上存在问题,就像您在 LINQ to SQL 中所做的那样.为此,解决方案是切换到 LINQ 查询(LINQ to Objects)的客户端评估。这将要求您在调用 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,了解有关可能解决方案的详细讨论。 (两个链接都是缓存版本,因为原网站已经挂了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多