在需要根据字符串来确定列名,而进行排序的时候,有几种方法:
1.用反射,优点是安全性高,可用性较强 缺点是性能比较慢 多级的时候比较麻烦
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private static object GetValue<T>(T model, string field)
{
if (field.Split('.').Length == 1)
return model.GetType().GetProperty(field).GetValue(model, null);
int index = field.IndexOf('.');
string f1 = field.Substring(0, index);
string f2 = field.Substring(index + 1);
object obj = model.GetType().GetProperty(f1).GetValue(model, null);
return GetValue(obj, f2);
}
var aa = result.ToList().OrderBy(x => GetValue(x, "XX")).ToList();
{
if (field.Split('.').Length == 1)
return model.GetType().GetProperty(field).GetValue(model, null);
int index = field.IndexOf('.');
string f1 = field.Substring(0, index);
string f2 = field.Substring(index + 1);
object obj = model.GetType().GetProperty(f1).GetValue(model, null);
return GetValue(obj, f2);
}
var aa = result.ToList().OrderBy(x => GetValue(x, "XX")).ToList();
这个方法比较烦的是不能在query后面直接跟oderby一定要在list后面 这就导致大量数据要先读取出来再进行排序 很影响效率
2.用query的orderby
var aa = result.OrderBy("it.XX.YY.OO").ToList();
可以定义一个字典 然后根据传入的需要排序的字段的字符串进行转换成it.XX.YY.OO 这样无论几层都可以轻松搞定 缺点是可能性不强 可能有隐患
倒序的话 可以直接 在it.XX.YY.OO 后面加" desc"就可以了
3.比较麻烦的反射 还在研究中= =
还有一个记事是ajax调用controller里的接口是不是参数一定要是id = =比较烦