簡體   English   中英

為LINQ / Lambda創建一個OrderBy表達式

[英]Create an OrderBy Expression for LINQ/Lambda

我正在創建一個概念證明,它將Lambda / LINQ用於動態where和orderby。 以下代碼適用於where表達式,但我無法弄清楚如何通過表達式創建訂單。 對於這個例子,如果可能的話我想保持簡單; 我寧願不編寫修改表達式樹的代碼。

void Main()
{
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;    
    List<Products> products = GetProducts(filter, Products);
    Console.WriteLine(products);
}

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter,  Table<Products> Products)
{

    var products = Products.Where(filter);
    return products.ToList();
}

我想要的是類似於以下內容,但無法弄清楚通過表達式創建順序的代碼。

void Main()
{
    DateTime productSince = DateTime.UtcNow.Subtract(new TimeSpan(1,30,0));
    Expression<Func<Products, bool>> filter = d => d.CreatedDate > productSince && d.Price < 100 ;
    Expression<Func<Products, ????>> orderBy = d => ??????;

    List<Products> products = GetProducts(filter, orderBy, Products);
    Console.WriteLine(products);
}

private static List<Products> GetProducts(Expression<Func<Products, bool>> filter,
               Expression<Func<Products, ???>> orderBy, Table<Products> Products)
{

    var products = Products.Where(filter).OrderBy(orderBy);
    return products.ToList();
}

如果您想知道,我正在使用LinqPad進行此概念驗證。

private static List<Products> GetProducts<TOrderBy>(Expression<Func<Products, bool>> filter,
               Expression<Func<Products, TOrderBy>> orderBy, Table<Products> Products)
{

    var products = Products.Where(filter).OrderBy(orderBy);
    return products.ToList();
}

如果你看一下OrderBy擴展方法,它接受一個Expression<Func<T, TOrderBy>>因為該表達式可以導致任何類型的依賴

.OrderBy(x => x.ID) // <T, int>
.OrderBy(x => x.Name) // <T, string>

因此,您的包裝器方法需要能夠接受傳入的泛型類型。

你在尋找的是:

Expression<Func<Products, dynamic>>;

嘗試創建一個結構/類來保存Expression,如果它是升序或降序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM