Jer*_*xon 4 c# linq sql-order-by expression-trees
以下代码工作正常(它构建一个通用的OrderBy):
public class Item
{
public int Value { get; set; }
public string Name { get; set; }
}
var _List = new List<Item>
{
new Item{ Name = "Smith", Value = 3},
new Item{ Name = "Smith", Value = 2},
new Item{ Name = "Wesson", Value = 1},
new Item{ Name = "Wesson", Value = 4},
}.AsQueryable<Item>();
var _Type = typeof(Item);
// OrderBy
var _OrderByProperty = _Type.GetProperty("Value");
var _OrderByParameter = Expression.Parameter(typeof(Item), "x");
// OrderBy(x => x.Value)
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name);
var _OrderByLambda = Expression.Lambda<Func<Item, Int32>>
(_OrderByBody, _OrderByParameter);
// apply the OrderBy
_List = _List.OrderBy(_OrderByLambda);
Run Code Online (Sandbox Code Playgroud)
但是,我想以这种方式改变这一行:
var _OrderByLambda = Expression.Lambda<Func<Item, object>>
(_OrderByBody, _OrderByParameter);
Run Code Online (Sandbox Code Playgroud)
这样的更改将使有序列的数据类型通用.但是,这样的更改会导致以下异常:
类型'System.Int32'的表达式不能用于返回类型'System.Object'
有任何想法吗?
编辑,谢谢你的答案,这很好用:
var _OrderByProperty = _Type.GetProperty("Value");
var _OrderByParameter = Expression.Parameter(typeof(Item), "x");
// OrderBy(x => x.Value)
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name);
var _OrderByConverted = Expression.Convert(_OrderByBody, typeof(object));
var _OrderByLambda = Expression.Lambda<Func<Item, object>>
(_OrderByConverted, _OrderByParameter);
// apply the OrderBy
_List = _List.OrderBy(_OrderByLambda);
Run Code Online (Sandbox Code Playgroud)
您需要指定正文的返回类型System.Object.您可以通过插入转换(C#隐式执行)来完成此操作:
_OrderByBody = Expression.Convert(_OrderByBody, typeof(object));
Run Code Online (Sandbox Code Playgroud)