将WebGrid列名映射到OrderBy Lambda表达式的动态方法

时间:2013-11-05 12:54:48

标签: .net linq entity-framework lambda

我遇到了需要按特定列订购网格的困难时刻。

当我点击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,该名称基本上表示对该类型属性的调用?

赞赏。

2 个答案:

答案 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);
    }