自定义订单由于数百列
本文关键字:于数百 自定义 | 更新日期: 2023-09-27 18:08:33
我有一个表,其中有数百列(如FirstName
和LastName
)。
所有这些数据显示为GridView
与清单。我已经使用了具有e.SortExpression
的SortCommand
事件,但我无法理解如何在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;
}
您也可以动态地创建表达式树,但这不是很明显。