0

我有困难的时刻需要按特定列排序网格。

当我在网格中单击时,真正的问题仍然存在,一个带有列名的查询字符串被传递。

我需要将每个网格的每个列名映射到一个 lambda 表达式,以传递给将由实体框架解析器调度的查询并返回排序的数据。

我真正喜欢的是一个创建动态 lambda 表达式或基本上是成员调用(属性)的类 - 通过指向属性/列名或添加到主查询的反射以某种方式创建表示订单表达式的节点,并且返回 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);
    }
}

并且基本上基于columnName将订单节点添加到我的全局查询中,但我需要为每个属性进行每个映射。

有一些全局方法可以创建 lambda 表达式的那部分,它根据 columnName 的名称创建 lambda,该名称基本上表示该类型属性的调用?

赞赏。

4

2 回答 2

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);
    }
于 2014-11-13T09:39:59.357 回答
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”,但这是简单的字符串翻译。

于 2013-11-05T19:02:52.753 回答