EF - 为什么不包括属性的工作

时间:2011-09-12 16:54:18

标签: entity-framework c#-4.0 orm entity-framework-4.1

所以我的课程看起来像这样。

public class User {
    public virtual IList<Member> Members {get;set;}
}

public class Member {
    public virtual AnotherTable Another {get;set;}
}

public class AnotherTable {
    public string Name {get;set;}
}

当我直接对DataContext执行查询时,Include有效,但是当我在成员的IList上执行AsQueryable()时,include不起作用。

是否有办法在延迟加载的属性上使用Include / Eager功能,例如上面的Members属性,或者我是否总是需要通过DataContext来获取该功能?

User.Members.AsQueryable().Include(a => a.Another).ToList() // <-- nada, no way Jose
_db.Members.Include(m => m.Another).ToList() // <-- all good in the neighborhood

我问因为它可能是1 sql查询与100个查询的巨大差异,因为结果等效。

提前致谢。

3 个答案:

答案 0 :(得分:3)

AsQueryable没有使它成为linq-to-entities查询。它仍然是List之上的Linq-to-object查询。 List不知道如何处理Include - 只有DbQuery才知道,因此您必须DbQuery

var entry = context.Entry(user);
entry.Collection(u => u.Member).Query().Include(m => m.Another).Load();

答案 1 :(得分:0)

您必须通过DbContext才能使Include()正常工作。您可以将其抽象到存储库中,但是您仍然需要将Include()表达式传递给基础上下文。

    private IQueryable<T> GetQuery<T>(params Expression<Func<T, object>>[] includeProperties) where T : class
    {
        IQueryable<T> query = _db.Set<T>();

        if (includeProperties != null)
        {
            foreach (Expression<Func<T, object>> expression in includeProperties)
            {
                query = query.Include(expression);
            }
        }

        return query;
    }

答案 2 :(得分:-1)

我也面临同样的问题。

我解决了这个问题,只是添加了参考System.Data.Entity&amp;使用以下命名空间:

   using System.Data.Entity;

你可以尝试一下。