我正在将使用 LINQ to SQL 的应用程序转换为 LINQ to Entities。我使用存储库模式,并且遇到了一个适用于 LINQ to SQL 但不适用于实体的问题。
在我的数据层中,我使用 LINQ 语句来填充我的对象图,这样我的数据库实体就不会暴露在其他任何地方。在此示例中,我有一个返回类别列表的查找存储库。它看起来像这样:
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()' 方法,并且此方法无法转换为存储表达式。
作为参考,以下工作虽然不返回我需要的数据(它基本上是一个连接):
var q = from p in Programs
from pc in p.Categories
join c in getCategories() on pc.categoryID equals c.id
select new
{
id = p.id,
category = c
};
我理解错误在概念上的含义,但是 LINQ to SQL 会使其工作。我的整个数据层都有这种模式,我真的很想保留它。这应该工作吗?如果没有,如何在不混合图层的情况下对其进行修改。