我使用索引视图,它是一个没有任何关系的实体(与我的表实体的关系会更好,但这似乎几乎不可能实现)。该视图由 4 个 FK 组成,它们共同构成 PK:
PortalID
CategoryID
BranchID
CompanyID
现在我加入这个视图来选择一组这样的公司:
var companies = (from c in database.Companies.FindAll().Include("City")
join l in database.CompanyList.FindAll() on c.ID equals l.CompanyID
where l.PortalID == 9 && l.BranchID == 1597
select c).Take(10);
实体公司与表城市(CityID、城市)有关联,我想将其包含在内并完美运行。但是,当我加入视图时,.Include() 被完全忽略,因此导致查询没有连接到城市表。
正如您可能已经得出的结论,我使用存储库模式,FindAll() 返回一个 IQueryable,并且我手动将 Include 扩展添加到 IQueryable,如下所示:
public static IQueryable<T> Include<T>(this IQueryable<T> sequence, string path) {
var objectQuery = sequence as ObjectQuery<T>;
if (objectQuery != null)
return objectQuery.Include(path);
return sequence;
}
我已经彻底测试了这个扩展并且可以正常工作。
现在我的问题是,为什么它忽略最终表达式树中的 Include 操作以及如何防止它这样做?
UPDATE:
我从以下链接得到了我的解决方案:http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx
这说明我需要像这样重写我的查询:
var companies = (from c in database.Companies.GetAll()
join l in database.CompanyList.GetAll() on c.ID equals l.CompanyID
where l.PortalID == 9 && l.BranchID == 1597
select c).Include("City").Take(10);