泛型列表对象按动态列名排序

本文关键字:排序 动态 列表 对象 泛型 | 更新日期: 2023-09-27 18:29:03

我正在尝试对来自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层对数据进行排序。

请给我一些建议。

泛型列表对象按动态列名排序

您必须按结果集中的列排序。如果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();

使用一些助手查看动态where和order的答案此处的方法在哪里可以找到使用linq&lambda表达式生成动态where和orderby sql?

那么您是说调用方法将通过sidx参数提供一个Property名称,并且您想按该属性排序吗?

最简单的方法是使用动态LINQ库。另一种选择是使用反射来查找您要查找的属性,然后从中构建lambda表达式