使用Entity Framework加入视图时使用.Include()

时间:2010-10-20 09:49:31

标签: c# sql sql-server-2005 entity-framework entity-framework-4

我使用索引视图,它是一个没有任何关系的实体(与我的表实体的关系会更好,但这似乎几乎不可能实现)。这个视图由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);

实体公司与表格(城市ID,城市)有关联,我希望包含这些表格并且工作正常。但是当我加入视图时,.Include()被完全忽略,从而导致查询没有连接到cities表。

正如您可能已经使用存储库模式得出结论而FindAll()返回IQueryable并且ive手动将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);

1 个答案:

答案 0 :(得分:0)

你的问题的答案为什么忽略最终表达式中的Include操作?因为当您使用 CompanyList 加入公司表时,此连接操作的结果实体类型是新类型包含两种实体类型仅基本类型属性但是如果您想要包含城市必须将结果类型转换为公司类型,然后调用包含此类型的城市。