c# - 使用 Entity Framework 加入 View 时使用 .Include()

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

<分区>

我使用的是索引 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);

最佳答案

您的问题的答案为什么忽略最终表达式中的 Include 操作?因为当你加入 Companies 表与 CompanyList 这个加入操作的结果实体类型是新类型只包含两种实体类型原始类型属性但是如果你想包括城市你必须将结果类型转换为公司类型,然后调用包含此转换类型的城市。

关于c# - 使用 Entity Framework 加入 View 时使用 .Include(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976563/

相关文章:

sql - 有没有办法使用 LIMIT 关键字在 Postgres 中获取一系列记录

sql-server - TSQL如何在xml列中选择具有技能的员工

sql-server - 人们用什么来单元测试他们的存储过程等

具有动态 Func<> 构造的 C# Fluent API

c# - 带对话框的长时间运行任务

c# - 为什么.NET 框架不提供深度复制对象的方法?

SQL Server 2005 bigint 缺失?

c# - 如何在同一个项目中针对netcoreapp2.0和net461

php - 超过 600 个连接的 MySQL

sql - 带条件搜索字符串