C# 使用类方法对查询排序

C# 使用类方法对查询排序,c#,linq,C#,Linq,我试图在我创建的类中创建一个查询排序方法 我写了以下内容,希望每当我将查询作为参数传递时,它都能为我排序: public static void Ordenar<T>(IEnumerable<T> query, string columna, string orden) { if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna))) {

我试图在我创建的类中创建一个查询排序方法

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

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));
        }
    }
如何“选择”我要按常规顺序排列查询的字段?
请帮忙。D:我正在使用ASP.NET MVC3查看动态Linq,它允许您指定基于字符串的排序和/或筛选(例如,对于用户输入)

查看动态Linq,它允许您指定基于字符串的排序和/或筛选(例如,对于用户输入)

在不讨论是否应该这样做的优点的情况下,下面是一些代码错误的地方

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

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

公共静态IEnumerable Ordenar(IEnumerable查询,
字符串列A、字符串orden)
{
if(!(String.IsNullOrEmpty(orden)| String.IsNullOrEmpty(columna)))
{
FieldInfo orderField=typeof(T).GetField(columna);
如果(orden=“ASC”)
返回query.OrderBy(x=>orderField.GetValue(x));
如果(orden=“描述”)
返回query.OrderByDescending(x=>orderField.GetValue(x));
}
返回查询;
}

在不讨论是否应该这样做的优点的情况下,下面是一些代码错误的地方

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

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

公共静态IEnumerable Ordenar(IEnumerable查询,
字符串列A、字符串orden)
{
if(!(String.IsNullOrEmpty(orden)| String.IsNullOrEmpty(columna)))
{
FieldInfo orderField=typeof(T).GetField(columna);
如果(orden=“ASC”)
返回query.OrderBy(x=>orderField.GetValue(x));
如果(orden=“描述”)
返回query.OrderByDescending(x=>orderField.GetValue(x));
}
返回查询;
}

很抱歉这里的速度太慢,但是LINQ
OrderBy
OrderByDescending
方法有什么问题?为什么您需要自定义版本?当您说它无法工作时,您的意思是使用上面的代码吗?您的方法不返回序列“query”。您是否希望它像“通过引用”一样订购?IEnumerable不会发生这种情况。我正在尝试按照我传递参数的模式对查询进行排序。我不知道“参照”订购是不可能的。无论如何,该方法不起作用:即使在方法结束之前,查询也不会被排序。很抱歉,这里的速度很慢,但是LINQ
OrderBy
OrderByDescending
方法有什么问题?为什么您需要自定义版本?当您说它无法工作时,您的意思是使用上面的代码吗?您的方法不返回序列“query”。您是否希望它像“通过引用”一样订购?IEnumerable不会发生这种情况。我正在尝试按照我传递参数的模式对查询进行排序。我不知道“参照”订购是不可能的。不管怎样,这个方法不起作用:即使在方法结束之前,查询也不会被排序。谢谢链接,这很有趣。谢谢链接,这很有趣。
db.Thingys.OrderBy(x=> x.Name);
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;
}