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

Fab*_*ian 6 c# sql entity-framework sql-server-2005 entity-framework-4

我使用索引视图,这是一个没有任何关系的实体(与我的表实体的关系将是更好的,但这似乎几乎不可能实现).这个视图由4个FK组成,它们共同构成了PK:

PortalID
CategoryID
BranchID
CompanyID
Run Code Online (Sandbox Code Playgroud)

现在我加入这个视图来选择这样一组公司:

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);
Run Code Online (Sandbox Code Playgroud)

实体公司与表格(城市ID,城市)有关联,我想要包含并完美地运作.但是,当我加入视图时,.Include()被完全忽略,从而导致查询没有连接到cities表.

正如您可能已经使用存储库模式得出结论而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;
}
Run Code Online (Sandbox Code Playgroud)

我已经彻底测试了这个扩展,并且它应该像它一样工作

所以现在对于我的问题,为什么它忽略了最终表达式树中的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);
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sif 0

您的问题的答案为什么它忽略最终表达式中的 Include 操作?因为当您使用CompanyList连接Companies表时,此连接操作的结果实体类型是新类型,仅包含两种实体类型的原始类型属性,但如果您想包含城市,则必须将结果类型转换为 Company Type,然后调用 include City演员类型。