假设我有一个这样的方法:
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()
使用各种includes作为参数?
在最坏的情况下,我可以在存储库中为每个场景加载不同的方法(或者我应该这样做吗?感觉控制器应该说视图想要什么…或者DbSet是EF唯一的吗?我应该只从存储库返回IEnumarables?)
非常感谢
因为GetIngredients()调用无论如何都要加载所有内容?
不,在查询(例如,通过foreach)或调用ToList
或ToArray
扩展方法之前,不会执行查询
有没有一种方法可以让GetIngredients()使用各种include作为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
之前从DB中获取数据。因此,如果您从控制器调用此方法以将结果作为参数传递给视图,则将返回类型更改为IEnumerable<Ingredient>
,并在方法query.ToList();
结束时调用ToList
,以确保在将结果传递给视图之前执行查询。