首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于属性和复杂对象的动态OrderBy查询

基于属性和复杂对象的动态OrderBy查询
EN

Stack Overflow用户
提问于 2012-09-12 12:18:00
回答 1查看 1.8K关注 0票数 0

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

谢谢,

我的目标:

代码语言:javascript
复制
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; }
}

我有一段代码要分类:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2012-09-12 12:34:36

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

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

代码语言:javascript
复制
data.OrderBy(p => p.Language.Name)

这基本上是两个属性访问表达式,其中一个的“源”是另一个的“结果”。因此,您需要使用您的属性字符串(例如。( "Language.Name"),将其分成几个部分,然后在各个位上迭代,并将当前表达式作为目标。类似于:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12388021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档