LINQ/Lambda の OrderBy 式を作成する 質問する

LINQ/Lambda の OrderBy 式を作成する 質問する

動的な where と orderby に Lambda/LINQ を使用する概念実証を作成しています。次のコードは where 式には機能しますが、order by 式の作成方法がわかりません。この例では、可能であればシンプルにしておきたいので、式ツリーを変更するコードは書きたくありません。

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 を使用しています。

ベストアンサー1

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>

したがって、ラッパー メソッドは、渡すジェネリック型を受け入れることができる必要があります。

おすすめ記事