如何在Entity Framework中加载没有延迟加载的嵌套实体?

时间:2015-02-04 08:17:20

标签: c# entity-framework ef-code-first

我有以下型号:

public class Order 
{
    public int Id {get; set;}
    public int Number {get; set;}
    public virtual ICollection<OrderDetail> Details {get; set;}
}

public class OrderDetail
{
    public int Id {get; set;}
    public int OrderId {get; set;}
    public virtual Product Product {get; set;}
}

public class Product
{
    public int Id {get; set;}
    public int Number {get; set;}
    public string Description {get; set;}
}

在我的OrderRepository中,我加载了一个完整的订单:

public override Order Get(int id)
{
    return base.Get(id, x => x.Details);
}

基本方法是:

public virtual T Get(int id, params Expression<Func<T, object>>[] include)
{
    if (include.Any())
    {
        var set = include.Aggregate<Expression<Func<T, object>>, IQueryable<T>>
                  (dbSet, (current, expression) => current.Include(expression));

        return set.SingleOrDefault<T>(x => x.Id == id);
    }

    return dbSet.Find(id);
}

以上工作部分正常,因为它加载了Order和OrderDetails。但是,我还想为每个Detail加载相关的Product,以便我也可以在列表中显示产品描述。

如何改进上述方法以允许我这样做?

1 个答案:

答案 0 :(得分:1)

只需添加嵌套Select的另一个参数:

public override Order Get(int id)
{
    return base.Get(id, x => x.Details, x => x.Details.Select(z => z.Product));
}

请参阅MSDN