0

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);
4

1 に答える 1

1

プロパティでソートする解決策はありますか?このプロパティはプリミティブではなく「複雑なオブジェクト」ですか?

確かに - 基本的に次のような式ツリーを作成する必要があります。

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

これは基本的に 2 つのプロパティ アクセス式であり、そのうちの 1 つの "ソース" は別の "結果" です。そのため、プロパティ文字列 (例: "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 に答える