3

我有以下 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”。

我错过了什么?

4

2 回答 2

1

您不能像这样使用 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();
}

我希望它会有用。

于 2019-09-21T04:27:32.483 回答
1

根据文档:

实现 IEnumerable 的对象支持标准查询运算符的子集。具体来说,允许使用以下构造,其中 seq 是一个 IEnumerable 实例,predicate 是一个布尔表达式,并且 selector 是任何类型的表达式:

  • seq.Where(谓词)
  • seq.Any()
  • seq.Any(谓词)
  • seq.All(谓词)
  • seq.Count()
  • seq.Count(谓词)
  • seq.Min(选择器)
  • seq.Max(选择器)
  • seq.Sum(选择器)
  • seq.Average(选择器)

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

于 2019-09-20T14:57:49.853 回答