Linq.Dynamic FirstOrDefault() 嵌套在 OrderBy 中

Linq.Dynamic FirstOrDefault() nested in 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");

但是它抛出异常:

"No applicable aggregate method 'FirstOrDefault' exists"

它必须是动态的,以便它接受其他名称而不是 "MATERIAL_TXT"。

我错过了什么?

根据文档:

A subset of the Standard Query Operators is supported for objects that implement IEnumerable. Specifically, the following constructs are permitted, where seq is an IEnumerable instance, predicate is a boolean expression, and selector is an expression of any type:

  • seq.Where(predicate)
  • seq.Any()
  • seq.Any(predicate)
  • seq.All(predicate)
  • seq.Count()
  • seq.Count(predicate)
  • seq.Min(selector)
  • seq.Max(selector)
  • seq.Sum(selector)
  • seq.Average(selector)

FirstOrDefault 不在列表中,因此可以合理地假设它不受支持。

您不能像那样将 FirstOrDefault 用作字符串。

如果你想创建动态 orderBy 试试这个:

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

希望有用。