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