<分区>
我使用的是索引 View ,它是一个没有任何关系的实体(最好与我的表实体建立关系,但这似乎几乎不可能实现)。该 View 由 4 个 FK 组成,它们共同构成了 PK:
PortalID
CategoryID
BranchID
CompanyID
现在我加入这个 View 来选择一组这样的公司:
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);
实体 Company 与表 Cities (CityID, City) 有关联,我想将其包含并完美运行。然而,当我加入 View 时,.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 操作,我怎样才能阻止它这样做呢?
更新:
我从以下链接获得了解决方案:
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);