计算属性的显式加载

时间:2014-01-14 10:26:14

标签: c# entity-framework

假设在我的模型中,我有一个取决于AB的计算属性C.D

是否可以制作

.Include("A")

等于

.Include("B").Include("C.D")

在我的linq到实体表达式?

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。 Include指定要包括在查询结果中的相关对象(即要加入的表)。因此A不是一个相关的对象,而是一个简单的计算属性,那么它就不可能包含它。


受@CodeCaster的启发 - 如果您不想为此实体创建存储库,您可以编写扩展方法来执行包含

public static IQueryable<Foo> IncludeA(this DbSet<Foo> foos)
{
    return foos.Include("B").Include("C.D");
}

用法:

db.Foos.IncludeA()

答案 1 :(得分:3)

默认情况下,对于Entity Framework,这是不可能的,但是如果将实际实体(例如,X)包装在根据情况执行Include()的某种特定于实体框架的存储库中,你最终会得到这样的东西:

public class XRepository
{
    private IDbSet<X> _dbSet;

    public IQueryable<X> Include()
    {
        return _dbSet;
    }

    public IQueryable<X> IncludeForA()
    {
        return Include().Include("B")
                        .Include("C.D")
    }
}

然后,从您想要访问包含XB的{​​{1}}集合的任何地方,请调用C.D方法。