2015-09-27 53 views
0

在我的存储库中,我试图使用急切加载来加载相关实体。不知道为什么,但似乎当我返回一个特定实体的所有实例时,返回相关实体,但是当我限制返回的结果时,相关实体不包含在结果中。急切加载导航属性

此代码在服务层返回的所有订单,包括相关的客户,OrderItem的,和产品实体:

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本身。这件事情呢?

+0

其实......我不太确定IQueryable具有相同的Include()功能DbSet <>。 – DevilSuichiro

回答

0

因此,不工作的存储库方法正在使用DBSet.Include不正确。 Include实际上是DBSet继承的DBQuery类的一种方法。我需要使用DBQuery.Include将查询替换为包含每个导航属性的查询的新实例。所以我改变了执行到:

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

    foreach (string navigationProperty in navigationProperties) 
     dbQuery = dbQuery.Include(navigationProperty); 

    return await dbQuery.Where(o => o.Id == id).FirstOrDefaultAsync(); 
}