Linq.Dynamic FirstOrDefault() вложен в OrderBy

У меня есть следующий оператор 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 ответа

Решение

По документации:

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

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

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

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

если вы хотите создать динамический порядок, попробуйте следующее:

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();
}

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

Другие вопросы по тегам