Есть ли способ группировать/сопоставлять запросы LINQ, например, несколько .Включить звонки?

#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);