0

我正在将使用 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 会使其工作。我的整个数据层都有这种模式,我真的很想保留它。这应该工作吗?如果没有,如何在不混合图层的情况下对其进行修改。

4

1 回答 1

1

你不能传给 getCategories() EF。

查询必须可破坏为表达式树。

首先计算 getCategories()。

例如

var simpleList = getCategories().Select(id).Tolist;

然后使用包含

where(t=> simpleList.Contains(t.CatId)   // or the query syntax equivalent
于 2013-08-27T17:02:43.640 回答