用于排序问题的动态LINQ帮助
我有一个简单的有序对象的IEnumerable集合。我想编写一个通用排序函数,它接受集合和对应于Order对象上的属性的sortkey。我不想硬编码每个属性的排序说明。我如何构建一个动态LINQ字符串来自动为我生成LINQ?以下是我的SortOrders()函数的当前状态:用于排序问题的动态LINQ帮助,linq,linq-to-sql,sorting,dynamic,predicate,Linq,Linq To Sql,Sorting,Dynamic,Predicate,我有一个简单的有序对象的IEnumerable集合。我想编写一个通用排序函数,它接受集合和对应于Order对象上的属性的sortkey。我不想硬编码每个属性的排序说明。我如何构建一个动态LINQ字符串来自动为我生成LINQ?以下是我的SortOrders()函数的当前状态: public IEnumerable<Order> SortOrders(IEnumerable<Order> orders, string sortKey) {
public IEnumerable<Order> SortOrders(IEnumerable<Order> orders, string sortKey)
{
// Sort order records
try
{
IEnumerable<Order> sortedOrders = new List<Order>();
// Extract sort key and direction from combined sortKey input
string _sortKey = this.SortKey.Replace(" ASC", "").Replace(" DESC", "");
bool sortASC = this.SortKey.EndsWith(" ASC");
switch (_sortKey)
{
case "CustomerID":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerID) : orders.OrderByDescending(o => o.CustomerID);
break;
case "CustomerAddress":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerAddress) : orders.OrderByDescending(o => o.CustomerAddress);
break;
case "CustomerCity":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerCity) : orders.OrderByDescending(o => o.CustomerCity);
break;
default:
sortedOrders = orders;
break;
}
return sortedOrders;
}
catch
{
return orders; // return original orders list in the event of errors
}
}
使用这样的单一指令:
case "CustomerID":
sortedOrders = (sortASC) ? orders.OrderBy(o => o.CustomerID) : orders.OrderByDescending(o => o.CustomerID);
sortedOrders = (sortASC) ? orders.OrderBy(o => o.PropertyName) : orders.OrderByDescending(o => o.PropertyName);
可以将要排序的表达式作为Lamba传递(这是简化/伪代码)
排序器(IEnumerable orders,Func-Func)
{
sortedOrders=orders.OrderBy(func)
....
}
//电话:
排序器(订单,o=>o.CustomerID);
您可以使用,不需要扩展方法。只需在DynamicQueryable类中使用扩展名,并将键和方向都指定为字符串
var sorted = orders.OrderBy( "CustomerID desc" );
这让我走了一半。。。如何动态生成函数调用本身?换句话说,如果Order对象有N个属性,我希望能够动态地组装“o=>o.OrderPropertyName”部分。我不想硬编码o=>o.CustomerID。谢谢你对这个问题感兴趣。如果你想让它完全动态,看看另一个答案。请务必意识到,您不需要对用于排序的lambda进行“硬编码”。您可以像传递任何变量一样传递它。
var sorted = orders.OrderBy( "CustomerID desc" );