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();
}
Надеюсь будет полезно.