#c# #linq #entity-framework-core
Вопрос:
Есть ли способ «сгруппировать» .Include
вызовы ниже и инкапсулировать их в другой метод, который я могу вызвать, как показано ниже?
var entity = _db.Entity.AsNoTracking()
.AsSplitQuery()
.Include(x => x.Prop1)
.Include(x => x.Prop2)
.Include(x => x.Prop3)
.Include(x => x.Prop4)
.FirstOrDefault(x => x.Id == id);
Что-то вроде:
var entity = _db.Entity.AsNoTracking()
.AllIncludes()
.FirstOrDefault(x => x.Id == id);
Я знаю о методах расширения в IEnumerable, но я не смог найти то, что мне нужно.
Комментарии:
1.
public static IQueryable<Entity> AllIncludes(this IQueryable<Entity> source) { return source.Include(x => x.Prop1); }
может быть?2. Это определенно возможно, вам нужен метод расширения off
DbSet<Entity>
илиIQueryable<Entity>
(или и то, и другое), чтобы во время компиляции код мог различать свойства, доступные для включения3. @CamiloTerevinto Это сработало. Спасибо
4. Я бы рекомендовал вам не делать этого. В конечном итоге вы получите IncludeAll в каждом запросе, даже если в этом нет необходимости. Это звучит так, как будто ты думаешь, что тебе это нужно, но ты не должен.
Ответ №1:
Вы можете достичь этого, написав метод расширения, который позволит вам «добавить» AllIncludes
метод поверх сущности базы данных.
Это позволит вам инкапсулировать .Include
вызовы.
Предположение _db.Entity
относится к типу IQueryable<Entity>
:
public static class QueryableExtensions
{
public static IQueryable<Entity> AllIncludes(this IQueryable<Entity> source)
{
return source
.Include(x => x.Prop1)
.Include(x => x.Prop2)
.Include(x => x.Prop3)
.Include(x => x.Prop4);
}
}
Позвоните, как и ожидалось:
var entity = _db.Entity.AsNoTracking()
.AllIncludes()
.FirstOrDefault(x => x.Id == id);