#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>>
, но что-то не сработало. Сегодня это работает (смеется). В любом случае, вы правы, спасибо!