使用类方法排序查询

时间:2012-05-23 17:09:49

标签: c# linq

我正在尝试在我工作的类中创建一个查询排序方法。

我写了以下内容,希望每当我将查询作为参数传递时,它都会为我订购:

public static void Ordenar<T>(IEnumerable<T> query, string columna, string orden)
    {
        if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna)))
        {
            if (orden == "ASC") query.OrderBy(x => x.GetType().GetField(columna).GetValue(query));
            if (orden == "DESC") query.OrderByDescending(x => x.GetType().GetField(columna).GetValue(query));
        }
    }

无济于事。我无法让它像这样工作:

db.Thingys.OrderBy(x=> x.Name);

如何“选择”此字段我想通过一般订购查询? 请帮忙。 D:我正在使用ASP.NET MVC3

2 个答案:

答案 0 :(得分:2)

查看动态Linq的http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx,它允许您根据字符串指定排序和/或过滤(例如,用户输入)

答案 1 :(得分:1)

如果没有考虑是否应该完成的优点,这里有一些代码错误的事情。

首先,您需要返回 LINQ查询的结果。 LINQ运算符本身不会改变源序列。

其次,columna参数可能对应于序列中元素的字段名称,而不是序列本身。因此,您需要在通用类型GetField上调用T,并在每个元素上调用GetValue(分配给x参数)。

public static IEnumerable<T> Ordenar<T>(IEnumerable<T> query, 
    string columna, string orden)
{
    if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna)))
    {
        FieldInfo orderField = typeof(T).GetField(columna);

        if (orden == "ASC")
            return query.OrderBy(x => orderField.GetValue(x));

        if (orden == "DESC")
            return query.OrderByDescending(x => orderField.GetValue(x));
    }

    return query;
}