Linq / lambda表达式

时间:2009-10-07 09:24:07

标签: linq sorting lambda

尝试使用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();

有人可以帮帮我吗? 谢谢!

1 个答案:

答案 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?)