2016-07-23 16 views
0

式ツリーをlinqで実装しようとしています。lambdaexpressionを式に変換できないため、エラー状態になります。私は他の解決策をチェックするのを助けますが、それほど助けにはならなかった以下は私のコードです'System.Linq.Expressions.LambdaExpression'から 'System.Linq.Expressions.Expression'に変換できません

ParameterExpression pe = Expression.Parameter(typeof(Person), "p"); 
var expr = Expression.Lambda(Expression.Property(pe, sortByProp), pe);   
      var d= expr.Compile(); 
      IQueryable<Person> query = persons.AsQueryable(); 
      List<Person> sortedList = query.OrderBy<Person, int>(expr).ToList(); 
+0

? – user3185569

+0

この式ツリーを使用して、どのように実装したいですか? –

+1

エラーの最後の部分は 'Expression'ではなく' Expression > 'なので、投稿のタイトルは誤解を招きます。あなたは 'sortByProp' **タイプ**が' int'であることをどのように知っていますか? –

答えて

5

表現木を使って動的にOrderByを実装しようとしているようです。あなたは次のことを試してみてください:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string sortProperty, ListSortDirection sortOrder) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortProperty); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.MakeMemberAccess(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    var typeArguments = new Type[] { type, property.PropertyType }; 
    var methodName = sortOrder == ListSortDirection.Ascending ? "OrderBy" : "OrderByDescending"; 
    var resultExp = Expression.Call(typeof(Queryable), methodName, typeArguments, source.Expression, Expression.Quote(orderByExp)); 
    return source.Provider.CreateQuery<T>(resultExp); 
} 

、その後、あなたはとしてそれを呼び出すことができます並べ替えに使用するプロパティです何

collection.OrderBy("Property on which you want to sort", ListSortDirection.Ascending); 
+0

それは私のために働いてくれてありがとう! – Akhilesh

+0

それがうまくいったのは良いことだ。 –

+0

式ツリーを使用してOrderByを動的に実装しようとしているようです。お助けしますか? - Clippy – svick

関連する問題