尝试使用Linq / Lambda,但不知道在哪里搜索。
我正在ASP.net GridView中进行一些简单的排序。这是一些示例代码:
IQueryable<User> query = (from c in users select c).AsQueryable<User>();
if (isAscending)
{
switch (e.SortExpression)
{
case "Name":
query.OrderBy(c => c.Name);
break;
default:
break;
}
}
else
{
switch (e.SortExpression)
{
case "Name":
query.OrderByDescending(c => c.Name);
break;
default:
break;
}
}
grid.DataSource = query.ToList();
grid.DataBind();
但是,我对代码不满意,因为它对错误非常敏感,需要大量重复的代码。我希望使用Lambda表达式解决这个问题,但我不知道如何解决。这就是我想要去的地方:
IQueryable<User> query = (from c in users select c).AsQueryable<User>();
var param = null;
switch (e.SortExpression)
{
case "Name":
param = (c => c.Name);
break;
default:
break;
}
if (isAscending)
{
query.OrderBy(param);
}
else
{
query.OrderByDescending(param);
}
grid.DataSource = query.ToList();
grid.DataBind();
有人可以帮帮我吗? 谢谢!
答案 0 :(得分:4)
您的代码目前已被破坏 - 您正在调用OrderBy / OrderByDescending但未使用结果。你需要
query = query.OrderBy(param);
等
至于有条件排序 - 问题是你不能声明param
的类型,因为排序键的类型可能因排序表达式而异。
作为解决方法,您可以编写自己的扩展方法:
public static IOrderedQueryable<TSource> OrderByWithDirection<TSource, TKey>
(this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
bool ascending)
{
return ascending ? source.OrderBy(keySelector)
: source.OrderByDescending(keySelector);
}
您的代码将成为:
IQueryable<User> query = (from c in users select c).AsQueryable<User>();
switch (e.SortExpression)
{
case "Name":
query = query.OrderByWithDirection(c => c.Name, isAscending);
break;
// etc
default:
break;
}
(顺便说一下,你为什么打电话给AsQueryable
?)