INCLUDE在实体框架中的奇怪行为

时间:2015-07-09 20:45:57

标签: c# entity-framework

这有效:

using (var dbContext = new SmartDataContext())
{
    dbContext.Configuration.ProxyCreationEnabled = false;

    var query = dbContext.EntityMasters.OfType<Person>();
    if (includeAddress)
        query.Include(p => p.Addresses);
    if (includeFiles)
        query.Include(p => p.FileMasters);

    output.Entity = query.Include(s=>s.Addresses).FirstOrDefault<Person>(e => e.EntityId == id);
}

虽然这不是:

using (var dbContext = new SmartDataContext())
{
    dbContext.Configuration.ProxyCreationEnabled = false;

    var query = dbContext.EntityMasters.OfType<Person>();
    if (includeAddress)
        query.Include(p => p.Addresses);
    if (includeFiles)
        query.Include(p => p.FileMasters);

    output.Entity = query.FirstOrDefault<Person>(e => e.EntityId == id);
}

我试图根据来自函数的布尔标志包含地址,文件。但是看起来,EF在使用IF条件时不包括它们。

这与我使用Include实际工作的previous问题有关。

2 个答案:

答案 0 :(得分:2)

您需要将Include的结果分配回query

query = query.Include(p => p.Addresses);

答案 1 :(得分:0)

实体框架&#39;包含&#39;函数仅在连接到查找实体的整个linq查询时才起作用。这是因为linq查询实际上是Expression的一种形式,可以在执行之前作为一个整体进行检查。

在第二个示例中,Person对象已经与数据库分离,因此EF没有关于Person来自哪个表以及如何将Person与地址表连接以获得所需结果的信息。

如果启用动态代理生成,EF可以跟踪实体与数据库之间的关系。但是,我不确定这是否会使include语句有效。