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