Entity framework LINQ to实体无法识别带有Let语句的方法

Entity framework LINQ to实体无法识别带有Let语句的方法,entity-framework,linq-to-entities,entity-framework-5,Entity Framework,Linq To Entities,Entity Framework 5,我正在将一个使用LINQ到SQL的应用程序转换为LINQ到实体的应用程序。我使用了一个存储库模式,遇到了一个在LINQtoSQL中有效但在实体中无效的问题 在我的数据层中,我使用LINQ语句填充我的对象图,这样我的数据库实体就不会暴露在其他任何地方。在本例中,我有一个Lookup Respository,它返回一个类别列表。看起来是这样的: public IQueryable<Entities.DomainModels.Category> getCategories() {

我正在将一个使用LINQ到SQL的应用程序转换为LINQ到实体的应用程序。我使用了一个存储库模式,遇到了一个在LINQtoSQL中有效但在实体中无效的问题

在我的数据层中,我使用LINQ语句填充我的对象图,这样我的数据库实体就不会暴露在其他任何地方。在本例中,我有一个Lookup Respository,它返回一个类别列表。看起来是这样的:

public IQueryable<Entities.DomainModels.Category> getCategories()
    {
        return (from c in Categories
                where !c.inactive
                orderby c.categoryName
                select new Entities.DomainModels.Category
                {
                    id = c.categoryID,
                    category = c.categoryName,
                    inactive = c.inactive
                });
    }
var d = from p in Programs
    let categories = (from pc in p.Categories
                      join c in getCategories() on pc.categoryID equals c.id
                      select c)
   select new 
    {
        id = p.id,
        title = p.title
       categories = categories.ToList()
        };
当我运行此操作时,会出现以下错误:

LINQ to Entities无法识别方法'System.LINQ.IQueryable'1[Entities.DomainModels.Category]getCategories()'方法,并且无法将此方法转换为存储表达式

作为参考,以下内容虽然不能返回我需要的数据,但仍然有效(基本上是一个连接):


我理解这个错误在概念上的含义,但是linqtosql可以使它工作。我在整个数据层中都有这种模式,我真的想保留它。这样行吗?如果没有,如何在不混合图层的情况下修改它。

您不能将
getCategories()
传递给EF

查询必须可分解为表达式树

首先计算getCategories()

乙二醇

然后使用

where(t=> simpleList.Contains(t.CatId)   // or the query syntax equivalent

您正在尝试使用无法转换为SQL语句的.net函数,这就是导致该错误的原因。如果join适合您,那么您需要跟踪join生成的SQL,并检查查询出了什么问题。程序和类别之间的关系是什么?程序可以有许多类别。此查询的工作方式与LINQtoSQL中的工作方式完全相同。我想我的确切问题就在这里描述:我想知道这是否在3年内有所改善。似乎EF6.0中已经包含了对此的修复。请参见EF 6.0中部分修复了此场景。我仍然不能直接调用getCategories(),但是如果我将该函数的代码复制到LET语句中,它就会工作。性能如何?无法缓存IEnumerable.Contains查询的查询计划
var simpleList = getCategories().Select(id).Tolist;
where(t=> simpleList.Contains(t.CatId)   // or the query syntax equivalent