急切加载导航属性

时间:2015-09-27 18:49:51

标签: entity-framework entity-framework-6

在我的存储库中,我尝试使用预先加载来加载相关实体。不确定为什么,但似乎当我返回特定实体的所有实例时,返回相关实体,但是当我限制返回的结果时,相关实体不包含在结果中。

服务层中的此代码返回所有订单,包括相关的Customer,OrderItem和Product实体:

public async Task<IEnumerable<Order>> GetOrdersAsync()
{
    return await _repository.GetAsync(null, q => q.OrderByDescending(p => p.CreatedDate), "Customer", "OrderItems", "OrderItems.Product");
}

在存储库中:

public async Task<IEnumerable<Order>> GetAsync(Expression<Func<Order, bool>> where = null, Func<IQueryable<Order>, IOrderedQueryable<Order>> orderBy = null, params string[] navigationProperties)
{
    IQueryable<Order> query = _context.Set<Order>();

    if (where != null)
    {
        query = query.Where(where);
    }

    //Apply eager loading
    foreach (string navigationProperty in navigationProperties)
            query = query.Include(navigationProperty);

    if (orderBy != null)
    {
        return await orderBy(query).ToListAsync();
    }
    else
    {
        return await query.ToListAsync();
    }
}

服务层中的此代码按ID获取订单,但无论出于何种原因未返回相关的Customer,OrderItem和Product实体:

public async Task<Order> GetOrderByIdAsync(long id)
{
  return await _repository.GetByIdAsync(id, "Customer", "OrderItems", "OrderItems.Product");
}

在存储库中:

public async Task<Order> GetByIdAsync(long id, params string[] navigationProperties)
{
    DbSet<Order> dbSet = _context.Set<Order>();

    foreach (string navigationProperty in navigationProperties)
        dbSet.Include(navigationProperty);

    return await dbSet.FindAsync(id);
}

我在两个存储库方法之间看到的一个区别是,在包含导航属性之前,将_context.Set()强制转换为IQueryable,而另一个则直接在DbSet本身上调用Include。这有关系吗?

1 个答案:

答案 0 :(得分:0)

因此无法正常使用DBSet.Include的存储库方法。 Include实际上是DBBS类的一个方法,DBSet继承自该方法。我需要使用DBQuery.Include将查询替换为我包含的每个导航属性的新查询实例。所以我将实现改为:

askuser = askuser.strip().replace(' ','').replace('\t','')