假设我有一个这样的方法:
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?)
非常感谢
答案 0 :(得分:1)
因为GetIngredients()调用是无意义的还是缓慢的 无论如何要加载一切?
不,在您查询之前(例如,通过foreach)或调用ToList
或ToArray
扩展方法
有没有办法让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}在将结果传递给视图之前,请确保您正在执行查询。