Linq.Dynamic FirstOrDefault (), вложенный в OrderBy - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть следующий оператор Linq, который прекрасно работает:

query = query.OrderBy(m => m.MATERIAL_TXT.Where(mt => mt.LANG == "EN").FirstOrDefault().LTEXT);

Теперь я пытаюсь сделать его динамичным, используя строковый синтаксис из Linq.Dynamic:

query = query.OrderBy("MATERIAL_TXT.Where(LANG==\"EN\").FirstOrDefault().LTEXT");

Но он выдает исключение:

"Не существует применимого метода агрегирования 'FirstOrDefault'"

Он должен быть динамическим, чтобы он принимал другие имена вместо "MATERIAL_TXT ".

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Согласно документации:

Подмножество стандартных операторов запросов поддерживается для объектов, реализующих IEnumerable.В частности, допускаются следующие конструкции, где seq - это экземпляр IEnumerable, предикат - это логическое выражение, а селектор - выражение любого типа:

  • seq.Where (предикат)
  • seq.Any ()
  • seq.Any (предикат)
  • seq.All (предикат)
  • seq.Count ()
  • seq.Count(предикат)
  • seq.Min (селектор)
  • seq.Max (селектор)
  • seq.Sum (селектор)
  • seq.Average (селектор)

FirstOrDefault нет в списке, поэтому можно предположить, что он не поддерживается.

0 голосов
/ 21 сентября 2019

Вы не можете использовать FirstOrDefault в качестве такой строки.

, если хотите создать динамический порядокBy попробуйте это:

Func<IQueryable<YourEntityType>, IOrderedQueryable<YourEntityType>> orderBy;

   orderBy = x => x.OrderBy(m => m.MATERIAL_TXT.Where(mt => mt.LANG == "EN").FirstOrDefault().LTEXT);

Тогда вы можете использовать егокак это:

orderBy(query);

например, вы можете использовать его в другом методе:

public List<YourEntityType> YourMethodName(Func<IQueryable<YourEntityType>, IOrderedQueryable<YourEntityType>> orderBy,IQueryable<YourEntityType> query=null)
{
     query=query ?? GetYourEntityTypeList().AsQueryable();
     return orderBy(query).ToList();
}

Надеюсь, это будет полезно.

...