0

使用下面的代码,我没有任何问题可以排序FirstName,但我也LastName 希望能够排序。是否有对属性进行排序的解决方案,并且该属性是“复杂对象”而不是原始对象?NameCode

谢谢,

我的对象:

public class Person
{
    public Language Language { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Language
{
    public string Name { get; set; }
    public string Code { get; set; }
}

我有这段代码要排序:

var type = typeof(T);
var property = type.GetProperty("OrderBy");
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
MethodCallExpression resultExp = 
    Expression.Call(typeof(Queryable), 
    "OrderBy",
    new Type[] { type, property.PropertyType }, 
    source.Expression, 
    Expression.Quote(orderByExp));
return source.Provider.CreateQuery<T>(resultExp);
4

1 回答 1

1

是否有对属性进行排序的解决方案,并且该属性是“复杂对象”而不是原始对象?

当然 - 你必须基本上创建一个表达式树,相当于:

data.OrderBy(p => p.Language.Name)

这基本上是两个属性访问表达式,其中一个的“来源”是另一个的“结果”。因此,您需要获取您的属性字符串(例如“Language.Name”),将其拆分为多个部分,然后遍历各个位,将当前表达式作为目标。就像是:

Expression parameter = Expression.Parameter(type, "p");
Expression target = parameter;
foreach (string property in propertyParts)
{
    target = Expression.Property(target, property);
}
var orderByExp = Expression.Lambda(target, parameter);
于 2012-09-12T12:34:36.770 回答