通用列表对象OrderBy动态列名

时间:2012-03-26 03:55:22

标签: c# asp.net-mvc generics sorting

我正在尝试对来自Generic List对象的数据进行排序 通过使用以下代码,我可以根据Title列对数据进行排序 但我想做的是我想根据名为sidx的参数值对数据进行排序。

public ActionResult ListingGridData(string sidx, string sord, int page, int rows)
    {
        int currentPage = Convert.ToInt32(page) - 1;
        int totalRecords = 0;
        var SeminarList = (List<Seminar>)null;

        if(sord.Equals("asc"))
            SeminarList = seminarRepository.AllSeminarList().Seminar_Masters
                  .OrderBy(x => x.Title )
                  .Skip(currentPage * rows)
                  .Take(rows)
                  .ToList();
        else
            SeminarList = seminarRepository.AllSeminarList().Seminar_Masters
                  .OrderByDescending(x => x.Title)
                  .Skip(currentPage * rows)
                  .Take(rows)
                  .ToList();

        totalRecords = seminarRepository.AllSeminarList().Seminar_Masters.Count;

        var totalPages = (int)Math.Ceiling((float)totalRecords / (float)rows);

        ....
    }

所以我修改了我的代码,但它不起作用 它并没有像我预期的那样排序。

SeminarList = seminarRepository.AllSeminarList().Seminar_Masters
                  .OrderBy(x => sidx)
                  .Skip(currentPage * rows)
                  .Take(rows)
                  .ToList();

我现在使用的对象是纯List对象,而不是IQueryable对象。

至于排序目的,我不想回到SQL select statement,我想在Controller层对数据进行排序。

请让我得到任何建议。

3 个答案:

答案 0 :(得分:2)

您必须按结果集中的列进行排序。如果sidx不是结果集的一部分,那么就像通过常量排序一样。因此,每一行都是相同的,并且不会真正订购。假设sidx的值为10,那么就像对这个结果集进行排序一样:

Row 1 | 10
Row 2 | 10
Row 3 | 10
...

您可以看到排序如何毫无意义

您需要做的是将sidx添加到结果集中,如果这是您想要的:

SeminarList = seminarRepository.AllSeminarList().Seminar_Masters
                  .OrderBy(x => x.sidx)
                  .Skip(currentPage * rows)
                  .Take(rows)
                  .ToList();

答案 1 :(得分:1)

使用一些帮助程序查看动态where和orderby的答案 方法在这里  where can I find a good example of using linq & lambda expressions to generate dynamic where and orderby sql?

答案 2 :(得分:1)

所以你说调用方法会通过sidx参数提供一个属性名称,你想要按该属性排序吗?

最简单的方法是使用Dynamic LINQ library。另一个选择是使用反射来查找你正在寻找的属性,然后从中构建一个lambda表达式。