具有可为null字段的LINQ动态排序

本文关键字:LINQ 动态 排序 字段 null | 更新日期: 2023-09-27 18:20:56

我有一个动态排序机制,用于执行动态LINQ OrderBy。这在普通场地上效果很好。

string sortField = "MyField"
var orderByParam = Expression.Parameter(typeof(MyType), "MyType");
var sortExpression = Expression.Lambda<Func<MyType, object>>(Expression.Property(orderByParam, sortField), orderByParam);

然而,当我尝试使用一个Nullable字段(恰好是DateTime)时,我会得到以下错误:

不能使用类型为"System.Nullable `1[System.DateTime]"的表达式对于返回类型"System.Object"

我怎样才能避开这个?

具有可为null字段的LINQ动态排序

您需要先将其转换为对象。这与可为null的字段无关。即:

string sortField = "MyField";
var orderByParam = Expression.Parameter(typeof(MyType), "MyType");
var sortExpression = Expression.Lambda<Func<MyType, object>>(
  Expression.Convert(Expression.Property(orderByParam, sortField), 
  typeof(object)), orderByParam);

这是类型为';System.DateTime';不能用于返回类型';System.Object';以及类型为';System.Int32';不能用于返回类型';System.Object';

基本上,你不能对任何值类型(包括nullable)这样做,因为你需要显式地框

请参阅第一个链接的已接受答案。