我正在尝试在我工作的类中创建一个查询排序方法。
我写了以下内容,希望每当我将查询作为参数传递时,它都会为我订购:
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
答案 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;
}