c# - 为 LINQ/Lambda 创建 OrderBy 表达式

标签 c# 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>

因此,您的包装器方法需要能够接受要传入的通用类型。

关于c# - 为 LINQ/Lambda 创建 OrderBy 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5766247/

相关文章:

c# - 如何在 Web 应用程序 ASPX 代码前页面中使用 C# 7?

c# - 验证应用程序是否正在运行,如果没有则启动它

c# - 如何为此数据结构编写 linq 查询

C# LINQ SEO 一般编程题,如何正确获取某个位置的结果?

c# - 我怎样才能进行内联排序?

c# - 使用 C# 关闭所有打开的文件句柄

c# - 照片中的指南针元数据标签

c# - 何时首选 lambda 表达式中的参数?

kotlin - 为什么 Kotlin 内联函数参数不能为空

c# - 是否可以在单个语句中声明和使用匿名函数?