gpt4 book ai didi

c# - Entity Framework 和存储库模式(IQueryable 的问题)

转载 作者:太空狗 更新时间:2023-10-29 20:11:45 24 4
gpt4 key购买 nike

我刚刚从 Linq 2 SQL 切换到 Entity Framework,我在 EF 中看到一些奇怪的行为,希望有人能提供帮助。我试过谷歌搜索,但找不到其他有同样问题的人。我模拟了一个场景来解释这种情况。

如果我直接使用 EF 上下文,我可以在选择中进行选择。例如,这执行得很好:

        // this is an Entity Framework context that inherits from ObjectContext
var dc = new MyContext();

var companies1 = (from c in dc.Companies
select new {
Company = c,
UserCount = (from u in dc.CompanyUsers
where u.CompanyId == c.Id
select u).Count()
}).ToList();

但是,如果我使用存储库返回 IQueryable(甚至 ObjectSet 或 ObjectQuery)的存储库模式,我会收到 NotSupportedException(LINQ to Entities 无法识别方法“System.Linq.IQueryable”1)...

这是我的存储库的示例:

public class Repository {
private MyContext _dc;

public Repository() {
_dc = new MyContext();
}

public IQueryable<Company> GetCompanies() {
return _dc.Companies;
}

public IQueryable<CompanyUser> GetCompanyUsers() {
return _dc.CompanyUsers;
}
}

//我在另一个类中使用存储库(例如在我的服务层中)

        var repository = new Repository();

var companies2 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in repository.GetCompanyUsers()
where u.CompanyId == c.Id
select u).Count()
}).ToList();

以上代码抛出 NotSupportedException。

我意识到如果 Companies 和 CompanyUsers 之间存在关联,那么我可以简单地执行此操作并且它会正常工作:

        var companies3 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in c.CompanyUsers
select u).Count()
}).ToList();

...但我的示例只是更复杂场景的简化版本,其中我没有实体之间的关联。

所以我很困惑为什么 Entity Framework 会抛出 NotSupportedException。当我直接使用 EF 上下文时查询如何工作得很好,但如果我使用从另一个方法返回的 IQueryable 则不受支持。这在 Linq 2 SQL 中运行得非常好,但在 Entity Framework 中似乎不起作用。

如有任何见解,我们将不胜感激。

提前致谢。

最佳答案

我怀疑发生的事情是 EF 在第一个 select 的 lambda 中看到了 repository.GetCompanyUsers() 的表达式,但不知道如何处理这是因为 repository 不是 EF 上下文。我认为,如果您直接传入 IQueryable 而不是返回它的表达式,它应该可以工作。

如果你这样做怎么样:

    var companyUsers = repository.GetCompanyUsers();
var companies2 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in companyUsers
where u.CompanyId == c.Id
select u).Count()
}).ToList();

关于c# - Entity Framework 和存储库模式(IQueryable 的问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290491/

24 4 0