【发布时间】:2011-05-16 11:38:32
【问题描述】:
我刚刚从 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 中运行得非常好,但在实体框架中似乎不起作用。
任何见解将不胜感激。
提前致谢。
【问题讨论】:
标签: c# .net entity-framework entity-framework-4 iqueryable