我遇到了需要按特定列订购网格的困难时刻。
当我点击Grid时,真正的问题仍然存在,一个查询字符串与列的名称一起传递。
我需要将每个网格的每个列名称映射到一个lambda表达式,以便传递给将由实体框架解析器调度并返回有序数据的查询。
我真正喜欢的是一个创建动态lambda表达式或基本上成员调用(属性)的类 - 以某种方式创建通过指向属性/ columnName的反射来表示顺序表达式的节点或者添加到main的东西查询,并返回IQueryable,并将节点添加到我的全局IQueryable查询中。
想象一下有10名学生的学生网格。
| ID ||名称|| createdAt |记|
我想按照说明订购。
我必须有像
这样的东西public static class StudentPropertyMapper
{
static Dictionary<string, Func<IQueryable<Student>, IOrderedQueryable<Student>>> s_mapper = new Dictionary<string, Func<IQueryable<Student>, IOrderedQueryable<Student>>>();
static StudentPropertyMapper()
{
s_mapper.Add("Notes", q => q.OrderBy(e => e.notes));
}
public static IOrderedQueryable<Student> OrderedQuery(string columnName, IQueryable<Student> Student)
{
return s_mapper[columnName](Student);
}
}
基本上将order节点添加到基于columnName的全局查询中,但我需要为每个属性执行每个映射。
有一些全局方法可以创建lambda表达式的一部分,该部分基于columnName的名称创建lambda,该名称基本上表示对该类型属性的调用?
赞赏。
答案 0 :(得分:0)
试试这个:
public static Func<T, object> GetPropertyLambda<T>(string propertyName)
{
PropertyInfo property = typeof(T).GetProperty(propertyName);
return p => property.GetValue(p, null);
}
将其用作
var noteOrderedSudents = students.OrderBy(GetPropertyLambda<Student>("notes"));
请注意,属性名称必须与Student类属性(“notes”)匹配。在您的示例中,您需要将“Notes”翻译为“notes”,但这是简单的字符串翻译。
答案 1 :(得分:0)
This is for Orderby descending:
public ActionResult Index()
{
var Employees = db.Suppliers.Where(m => m.Status == 1).OrderByDescending(m => m.(your data field from db)).ToList();
return View(Employees);
}
This is orderby Ascending:
public ActionResult Index()
{
var Employees = db.Suppliers.Where(m => m.Status == 1).OrderBy(m => m.(your data field from db)).ToList();
return View(Employees);
}