EF6 — Включить объекты в список<Func>

#c# #linq #include #entity-framework-6 #entity

#c# #linq #включить #entity-framework-6 #сущность

Вопрос:

Я хочу, чтобы Include объекты запрашивались с помощью «Функций», а не строк. На этот раз я делаю это таким образом ( pagedListFunc.Includes есть List<string> ):

 foreach (var include in pagedListFunc.Includes)
{
    query = query.Include(include);
}
  

Я хочу использовать этот список:

 IncludeFuncs = new List<Func<Dicts, object>>()
{
    x => x.AspNetUsers,
    x => x.DictDomains
};
  

Когда я пытаюсь использовать pagedListFunc.Включить функции (на самом деле, это выше списка: List<Func<T, object>> ):

 foreach (var include in pagedListFunc.IncludeFuncs)
{
    query = query.Include(x => include(x)); // doesn't work
    // or
    query = query.Include(include); // wrong parameter error
}
  

Как использовать IncludeFuncs правильно?

Ответ №1:

Правильный тип параметра — Expression<Func<T, object>> , что означает, что ваш IncludeFuncs должен иметь тип List<Expression<Func<Dicts, object>>() , указанный в документах.

В качестве дополнительного примечания, вместо использования List , это было бы хорошим вариантом использования params ключевого слова и простого массива. При таком подходе вы могли бы указывать переменное количество аргументов при вызове метода.

Например, это будет выглядеть так (псевдокод):

 public Dicts GetById(int id, params Expression<Func<Dicts, object>>[] includeProps)
{
    ...
    foreach(var include in includeProps)
    {
        query = query.Include(include);
    }
    ...
}
  

Использование:

 GetById(1, x => x.AspNetUsers, x => x.DictDomains);
  

Комментарии:

1. Я пытался вчера с Expression<Func<Dicts, object>> , но что-то не сработало. Сегодня это работает (смеется). В любом случае, вы правы, спасибо!