asp.net mvc-是dbSet.如果在调用dbSet之后调用,则包含无意义的内容



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

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)或调用ToListToArray扩展方法之前,不会执行查询

有没有一种方法可以让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,以确保在将结果传递给视图之前执行查询。

相关内容

  • 没有找到相关文章

最新更新