0

ユーザーがドロップダウン リストから次の項目を選択するフォームがあります。

  table_name
  columnName_to_sort_by
  columnName_to_search_in

ユーザーはSearch_textテキストボックスに入力する必要があります

フォームは、多くのテーブルからデータを取得します。各テーブルのすべてのフィールドの並べ替えと検索を作成することは避けたいと思います。これが、式ツリーを使用したい理由です。クエリを動的に作成したい。

ユーザー入力に応じてselectwhere、メソッドの式ツリーを生成するジェネリック メソッドを作成したいと考えています。クエリされているものを取得するためにorderby使用できます(すべてのテーブルは型です - 私は LinqToSql を使用しています)。System.ReflectionType

式ツリーの作成方法がわかりません。

これが私がこれまでに持っているものです:

private static List<T> GetSortedData<T>( string sortColumnName) 
{ 
        var type = typeof(T); 
        var property = type.GetProperty(sortColumnName); 
        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 }, WHAT_SHOULD_BE_HERE, Expression.Quote(orderByExp)); 
        return (List<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

式ツリーを使用して動的に実装するselectにはどうすればよいですか?sortorderby

4

2 に答える 2

1

あなたが持っているものは近いです。「WHAT_SHOULD_BE_HERE」と尋ねると、OrderBy の「ソース」パラメーターを示すためにどの式を使用するかが気になります。これは通常、拡張メソッドとして使用される場合にオペランドから暗示されます。あなたがする必要があるのは、IQueryable で動作するようにサンプルを変更することであり、それを入力パラメーターとして受け入れる必要があります。また、以下に示すように、WHAT_SHOULD_BE_HERE プレースホルダーを「list.Expression」に置き換えます。

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

これを次のコードでテストしました。

static void Main(string[] args)
{
    var list = new List<Person>(new[] 
    { 
        new Person { FirstName = "John" }, 
        new Person { FirstName = "Jane" }
    }).AsQueryable();

    foreach (var o in GetSortedData(list, "FirstName")) 
        Console.WriteLine(o.FirstName);
}

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

印刷されたもの:

Jane
John
于 2010-08-07T21:55:16.200 に答える
0

で同じエラーに直面していましたOrder by

メソッドを調べたところCall、 Parameter -- が欠落していることがわかりましたlist.Expression。ここで、 list はあなたのものですIQuerable

于 2012-03-22T05:14:45.393 に答える