自定义订单由于数百列

本文关键字:于数百 自定义 | 更新日期: 2023-09-27 18:08:33

我有一个表,其中有数百列(如FirstNameLastName)。

所有这些数据显示为GridView与清单。我已经使用了具有e.SortExpressionSortCommand事件,但我无法理解如何在OrderBy函数中使用它,因为在输入lambda表达式之后。IntelliSense显示所有数百列,而不是我需要的那一列——我只在运行时有。

我如何使用Func<TSource, TKey>选择器OrderBy函数期望从我让它知道字符串e.SortExpression是需要排序的列?

我真正意思的例子:

private void dataGrid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
    var users = new UsersEntities().UsersTable.OrderBy(x => "x."+e.SortExpression);
    FillDataGrid(users); 
}

更新:我已经明白,我希望完成这一点的方式是使用表达式树,我希望有人能提供确切的解决方案。

更新2:我在这里找到了解决办法。结果我的问题是重复的,而且措辞很糟糕。谢谢大家。

我还注意到ken提供了非常确凿的证据,证明我应该使用动态linq。我将在将来考虑这样做,但我不禁注意到,与依赖库来为我做这些相比,尝试表达式树是多么有趣。在这个阶段,因为我对表达式树还不熟悉,所以这是一个利用它们的绝佳机会。

自定义订单由于数百列

您可以使用动态linq,这将允许您在string的基础上执行OrderBy

编辑

看我的评论。使用动态linq,您的解决方案可以像下面这样简单:

var users = new UsersEntities().UsersTable.OrderBy(e.SortExpression);

只要where子句中只涉及逻辑and,就可以轻松地动态创建LINQ表达式。只需重复Where子句!

// Filter
var query = new UsersEntities().UsersTable.Select(x => x);
if (!String.IsNullOrEmpty(nameFilter) {
    query = query.Where(x => x.Name == nameFilter);
}
if (!String.IsNullOrEmpty(zipFilter) {
    query = query.Where(x => x.Zip == zipFilter);
}
// Sorting
switch (sortField)
{
    case "Name":
        query = query.OrderBy(x => x.Name);
        break;
    case "Zip":
        query = query.OrderBy(x => x.Zip);
        break;
}

您也可以动态地创建表达式树,但这不是很明显。