0

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

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

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

4

2 回答 2

2

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

于 2012-05-23T17:48:41.147 回答
1

在不讨论是否应该这样做的优点的情况下,这里有一些你的代码有问题的地方。

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

其次,该columna参数可能对应于序列中元素的字段名称,而不是序列本身的名称。因此,您需要调用GetField泛型类型TGetValue每个元素(分配给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;
}
于 2012-05-23T18:29:03.660 回答