【问题标题】:Custom OrderBy Due to Hundreds of Columns由于数百列自定义 OrderBy
【发布时间】:2013-04-11 23:22:57
【问题描述】:

我有一个包含数百列的表(例如 FirstNameLastName)。

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

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

我的基本意思的例子:

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

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

更新 2: 我找到了解决方案here。原来我的问题是重复的,而且措辞很糟糕。谢谢大家。

而且我也刚刚注意到 ken 提供了非常确凿的证据表明我应该使用动态 linq。将来我会考虑这样做,但我不禁注意到尝试表达式树而不是依赖库为我做这些是多么有趣。在这个阶段,由于我还是表达式树的新手,这是一个利用它们的绝佳机会。

【问题讨论】:

    标签: c# .net ado.net


    【解决方案1】:

    您可以使用dynamic linq,这将允许您基于string 执行OrderBy

    编辑

    看我的评论。使用动态 linq,您的解决方案可能很简单:

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

    【讨论】:

    • 有机会坚持使用纯 Ado.Net 吗?我对 SQL 作为一种语言有一种无法解释的厌恶。
    • @Agon - 我很困惑......你在使用 ORM(LINQ-to-SQL,EntityFramework)吗?看起来你是。动态 linq 与 ORM 一起使用。
    • 我正在使用纯粹的实体(实体框架)。并且更愿意尽可能人道地坚持使用 C#。
    • @Agon - 动态 Linq 和实体框架可以很好地协同工作。动态 Linq != 动态 SQL。它是一个从字符串构建表达式的库,这些表达式可以在 IQueryable Where 和 OrderBy 方法中使用。
    • 谢谢你,肯,你的解释。我已选择您的回复作为答案。
    【解决方案2】:

    只要 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;
    }
    

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

    【讨论】:

    • 感谢您的建议,但我认为拥有数百条冗余行并不实用,编程的概念有点失去其目的。在过去的一个小时里,我一直在尝试使用表达式来完成这项工作,但我对表达式树的主题完全陌生(只有在创建这个问题后才发现它们)所以我很难过。但是这个方法基本上正是我要找的。​​span>
    • 谢谢,但我已经在那个确切的页面(以及十几个)上努力了整整一个小时,但仍然没有成功。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多