【发布时间】:2017-01-25 23:43:42
【问题描述】:
需要根据不确定的列数(1 或更多)对数据列表进行排序/排序。
我正在尝试做的是遍历所需的列并根据它们的编号将 OrderBy 或 ThenBy 添加到查询列表中,但我不成功...
这样做了,但它没有编译:
var query = GetAllItems(); //returns a IQueriable list of items
//for each selected column
for (int i = 0; i < param.Columns.Length; i++)
{
if (i == 0)
{
query = query.OrderBy(x => x.GetType().GetProperty(param.Columns[i].Name));
}
else
{
//ERROR: IQueriable does not contain a definition for "ThenBy" and no extension method "ThenBy"...
query = query.ThenBy(x => x.GetType().GetProperty(param.Columns[i].Data));
}
}
我该如何解决这个问题?或者有什么替代方法可以满足这个要求?
解决方案: @Dave-Kidder 的解决方案经过深思熟虑,解决了我遇到的编译错误。只有一个问题,OrderBy 仅在 ToList() 强制转换后执行(实际上是对结果进行排序)。这是一个问题,因为我无法将 ToList 转换回 IOrderedQueryable。 所以,经过一番研究,我找到了一个解决我所有问题的解决方案。
.Net 4.0 动态语言功能的 Microsoft 程序集:https://github.com/kahanu/System.Linq.Dynamic
using System.Linq.Dynamic; //need to install this package
更新代码:
var query = GetAllItems(); //returns a IQueriable list of items
List<string> orderByColumnList = new List<string>(); //list of columns to sort
for (int i = 0; i < param.Columns.Length; i++)
{
string column = param.Columns[i].Name;
string direction = param.Columns[i].Dir;
//ex.: "columnA ASC"
string orderByColumn = column + " " + direction;
//add column to list
orderByColumnList.Add(orderBy);
}
//convert list to comma delimited string
string orderBy = String.Join(",", orderByColumnList.ToArray());
//sort by all columns, yay! :-D
query.OrderBy(orderBy).ToList();
【问题讨论】:
标签: entity-framework linq entity-framework-6 sql-order-by