[英]LINQ Queries with dynamic OrderBy on property and complex object
使用下面的代码,我对FirstName
和LastName
进行排序没有任何问题,但是我也希望对Name
和Code
进行排序。 是否有解决方案可以对属性进行排序,并且此属性是“复杂对象”而不是原始类型?
谢谢,
我的对象:
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);
是否有解决方案可以对属性进行排序,并且此属性是“复杂对象”而不是原始类型?
当然-您必须基本上创建一个等效于以下内容的表达式树:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.