首页 文章

方法无法转换为商店表达式

提问于
浏览
82

我看到这个代码使用LINQ to SQL,但是当我使用Entity Framework时,它会抛出此错误:

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 .

有人能解释为什么会出现这种错误吗

1 回答

  • 107

    Reason: 按照设计,LINQ to Entities要求将整个LINQ查询表达式转换为服务器查询 . 在翻译查询之前,仅在客户端上评估几个不相关的子表达式(查询中不依赖于服务器结果的表达式) . 不支持没有已知转换的任意方法调用,例如本例中的GetHomeFeatures() .
    更具体地说,LINQ to Entities仅支持无参数构造函数和初始化程序 .

    Solution: 因此,要克服此异常,您需要将子查询合并到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)
           };
    }
    

    More Info: 请查看LINQ to Entities, what is not supported?了解更多信息 . 另请查看LINQ to Entities, Workarounds on what is not supported以获取有关可能解决方案的详细讨论 . (两个链接都是缓存版本,因为原始网站已关闭)

相关问题