1

単一の一般的な方法を使用して、ラムダ式内のプロパティを表す特定の文字列の順序付きリストを取得したいと考えています。

人々が以前にこれを要求したことは知っていますが、私にはうまくいきませんでした。私はこれを試しましたが、エラーがスローされました:

db.Books.OrderByDescending(x => x.GetType().GetProperty("Discount").GetValue(x,null))
        .Take(3);

私は現時点でこれを使用しています:

public IQueryable<Book> GetCheapestBooks()
{
    return db.Books.OrderBy(x => x.Discount)
                   .Take(3);
}
4

4 に答える 4

1

多分これはあなたが探しているものです:

動的Linq

これを使用すると、次のようなクエリを記述できます。

var result = db.Books.OrderBy( "Discount" ).Take( 3 );
于 2012-09-06T16:58:17.153 に答える
0

シンプルなコンソール アプリケーション。

class A
        {
            public int prop1 { get; set; }
            public int prop2 { get; set; }
        }

    class Program
    {
        static IEnumerable<T> GenericOrderByDescending<T>(IEnumerable<T> arg, string property, int take)
        {
            return arg.OrderByDescending(x => x.GetType().GetProperty(property).GetValue(x, null)).Take(take);
        }

        static void Main(string[] args)
        {           
            IEnumerable<A> arr = new List<A>()
                                     {
                                         new A(){ prop1 = 1, prop2 = 2},
                                         new A(){prop1 = 2,prop2 =2},
                                         new A(){prop1 = 3,prop2 =2},
                                         new A(){prop1 = 441,prop2 =2},
                                         new A(){prop1 = 2,prop2 =2}
                                     };

            foreach(var a1 in GenericOrderByDescending<A>(arr, "prop1", 3))
            {
                Console.WriteLine(a1.prop1);
            }
        }
    }

U は、メソッドdb.Boks.AsEnumerable()のパラメーターとして渡すことができます。GenericOrderByDescending<T>()T の代わりに、アイテムのタイプを入力する必要がありますdb.Boks。私の例では、クラスのインスタンスの配列をソートしていますAが、エラーはありません。正常に動作します。私はあなたを正しく理解しましたか?

于 2012-09-06T17:16:54.403 に答える
0

プロパティ式を作成する拡張メソッドを作成できます。

private static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
    PropertyInfo prop = typeof(T).GetProperty(propertyName);
    ParameterExpression paramExpr = Expression.Parameter(typeof(T), "obj");
    MemberExpression propExpr = Expression.Property(paramExpr, prop);

    Type funcType = typeof(Func<,>).MakeGenericType(typeof(T), prop.PropertyType);
    Type keySelectorType = typeof(Expression<>).MakeGenericType(funcType);
    LambdaExpression keySelector = Expression.Lambda(funcType, propExpr, paramExpr);

    MethodInfo orderByMethod = typeof(Queryable).GetMethods().Single(m => m.Name == "OrderBy" && m.GetParameters().Length == 2).MakeGenericMethod(typeof(T), prop.PropertyType);
    return (IOrderedQueryable<T>) orderByMethod.Invoke(null, new object[] { source, keySelector });
}
于 2012-09-06T17:53:17.907 に答える
0

このコードで試すことができます

public IQueryable<Book> GetCheapestBooks()
{
    db.Books.OrderBy(x => x.Discount).Take(3).AsQueryable<Book>();
}
于 2012-09-06T17:28:17.640 に答える