如果在调用dbSet后调用dbSet.Include是否无意义?

时间:2016-07-26 18:06:59

标签: asp.net-mvc performance entity-framework linq

假设我有一个这样的方法:

public DbSet<Ingredient> GetIngredients(int limit = 0)
        {
            return db.Ingredients;
        }

所以在我的控制器中,我可以这样打电话:

var ingredients = GetIngredients()
.Include(i => i.AspNetUser)
.Include(i => i.AspNetUser1)
.Include(i => i.Ingredient_Category)
.Include(i => i.Measurement_Unit);

它是无意义还是缓慢,因为GetIngredients()调用无论如何都会加载所有内容?

如果是这样,有没有办法让GetIngredients()使用各种包含作为参数?

最糟糕的情况我可以在存储库中为每个场景加载不同的方法(或者我应该只是这样做?感觉控制器应该说是视图想要的...或者DbSet是否是唯一的EF和我应该只从我的存储库返回IEnumarables?)

非常感谢

1 个答案:

答案 0 :(得分:1)

  

因为GetIngredients()调用是无意义的还是缓慢的   无论如何要加载一切?

不,在您查询之前(例如,通过foreach)或调用ToListToArray扩展方法

,您的查询将不会被执行
  

有没有办法让GetIngredients()使用各种包含as   PARAMS?

public IQueryable<Ingredient> GetIngredients(List<Expression<Func<TEntity, object>>> includes = null)
{
     IQueryable<TEntity> query = db.Ingredients;

     if (includes != null)
     {
         query = includes.Aggregate(query, (current, include) => current.Include(include));
     }
     return query;
}

关于您的上一个问题,您应该在DbContext处置之前从您的数据库中获取数据。因此,如果您从控制器调用此方法将结果作为参数传递给视图,则将返回类型更改为IEnumerable<Ingredient>,并在方法结束时调用ToList {{1}在将结果传递给视图之前,请确保您正在执行查询。