C#如何将.OrderBy与多列一起使用并将列号解码为列名?

Posted

技术标签:

【中文标题】C#如何将.OrderBy与多列一起使用并将列号解码为列名?【英文标题】:C# How to use .OrderBy with multiple columns and decode column number to column name? 【发布时间】:2014-03-02 04:58:25 【问题描述】:

所以我使用 Datatable.net、Asp.net MVC 控制器来提供 Json 数据。 我正在尝试做一些与这些帖子类似的事情:

LINQ Sort by Multiple Fields Multi Column Sort for Datatables.net

javascript Ajax 调用到服务器,我有以下参数:

> int iSortingCols    Number of columns to sort on
> int iSortCol_(int)  Column being sorted on 
>          (you will need to decode this number for your database)
> string  sSortDir_(int)  Direction to be sorted - "desc" or "asc".

这是我的数据集:

var db = new GER_MAPV_Context();
var allTags = db.TrimTables;
filteredTags = db.TrimTables.AsEnumerable();
IEnumerable<TrimTable> filteredTags;

//排序的依赖函数

Func<TrimTable, string> getColumnName = (
    c => getCurrentSortColumn(1) == 1 ? c.TAG :
    sortColumnIndex == 2 ? c.DESCRIPTION :
    sortColumnIndex == 3 ? c.SET_POINT :
    sortColumnIndex == 4 ? c.PRIORITY :
    sortColumnIndex == 5 ? c.LIMIT_TYPE :
    sortColumnIndex == 6 ? c.ALARM_TYPE :
    sortColumnIndex == 7 ? c.AUTOMATED_SYSTEM :
    sortColumnIndex == 8 ? c.COL_POL :
    sortColumnIndex == 9 ? c.PROPERTY :
    sortColumnIndex == 10 ? c.EQUIP_TYPE:
    sortColumnIndex == 11 ? c.P_ID :
    sortColumnIndex == 12 ? c.AREA :
    sortColumnIndex == 13 ? c.COMPLEX :
    sortColumnIndex == 14 ? c.UNIT :  //PI Unit Format Long-text
    sortColumnIndex == 15 ? c.UNIT_ : //Loop Number Format
    sortColumnIndex == 16 ? c.LOOP_TYPE : //Loop Type i.e. PI, FIT, PSV
    sortColumnIndex == 17 ? c.LOOP_ : //Loop Number
    sortColumnIndex == 18 ? c.LOOP_EXT  :
    c.UNIT
    );

然后我需要对这些列中的每一列进行相应的排序,最多 4 种。

filteredTags.OrderBy(getColumnName).ThenByDescending(getColumnName);
//could have 1 - 4 orderby.thenby arrangements

诀窍是我需要输入“sortColumnIndex” (这是一个数字,分别是 iSortCol_1 或 iSortCol_2 的 JSON 参数) 进入 getColumnName 函数,使其返回正确的列名。

我在这里绞尽脑汁。

问:那么执行此操作的基本步骤是什么? 我在这里尝试构建的 LINQ 表达式的基本要点是什么?

【问题讨论】:

Ah Yah 本教程完全回答了我的问题。 farm-fresh-code.blogspot.com/2012/02/… codeproject.com/Articles/280952/… 【参考方案1】:

我相信这对你有用。你只需要添加一个 lambda 函数。

var result = filteredTags
.OrderBy(t => getColumnName(t, iSortCol_1))
.ThenBy(t => getColumnName(t, iSortCol_2));

但是你的 getColumnName 需要有两个输入参数(table 和 columnNum)。

更新:

要包括排序列数和降序:

var r = firstDesc ? 
filteredTags
.OrderByDescending(t => getColumnName(iSortCol_1))
: filteredTags
.OrderBy(t => getColumnName(iSortCol_1))



for ( var i =1;  i < colCount; i++)

    r = nDesc ? 
    r.ThenByDescending(t => getColumnName(iSortCol_1))
    : r.OrderBy(t => getColumnName(iSortCol_1))

【讨论】:

啊呀...我们去! firstDesc 是什么?代表?我很困惑 对不起,firstIsDescending=sSortDir(0); nDesc=sSortDir(i);等【参考方案2】:

好的,如果有人好奇,这是我的最终代码: 我还发现这两个网站很有帮助:

Multiple Field Sorting

Farm Fresh Code MVC, DataTables

    //Dependent function for Sorting
    //This Functions Retrieves the Database Field Name to be used by the Orderby("Tag") function 
    // i.e. OrderBy(t => t.Area);
    // t = TrimTable
    // iSortCol = Column Number to Sort By
    Func<TrimTable, Int32, string> getColName =(
    (t, iSortCol) => iSortCol == 1 ? t.TAG :
                    iSortCol == 2 ? t.DESCRIPTION :
                    iSortCol == 3 ? t.SET_POINT :
                    iSortCol == 4 ? t.PRIORITY :
                    iSortCol == 5 ? t.LIMIT_TYPE :
                    iSortCol == 6 ? t.ALARM_TYPE :
                    iSortCol == 7 ? t.AUTOMATED_SYSTEM :
                    iSortCol == 8 ? t.COL_POL :
                    iSortCol == 9 ? t.PROPERTY :
                    iSortCol == 10 ? t.EQUIP_TYPE:
                    iSortCol == 11 ? t.P_ID :
                    iSortCol == 12 ? t.AREA :
                    iSortCol == 13 ? t.COMPLEX :
                    iSortCol == 14 ? t.UNIT :  //PI Unit Format Long-text
                    iSortCol == 15 ? t.UNIT_ : //Loop Number Format
                    iSortCol == 16 ? t.LOOP_TYPE : //Loop Type i.e. PI, FIT, PSV
                    iSortCol == 17 ? t.LOOP_ : //Loop Number
                    iSortCol == 18 ? t.LOOP_EXT  :
                    t.UNIT_
        );


   //Help Info: 
    //http://***.com/questions/958220/how-can-i-use-linq-to-sort-by-multiple-fields
    //http://***.com/questions/21582725/c-sharp-how-to-use-orderby-with-multiple-columns-and-decode-column-number-to-co#21583371
    //http://activeengine.net/2011/02/09/datatablepager-now-has-multi-column-sort-capability-for-datatables-net/
    //http://msdn.microsoft.com/en-us/library/bb534852(v=vs.110).aspx


    //Number of Columns to Sort
    int iSortCols = Convert.ToInt32(param.iSortingCols);
    Debug.WriteLine("Count of Sortable Columns" + iSortCols);
    //int   iSortCol_(int)  Column being sorted on (you will need to decode this number for your database)
    //string    sSortDir_(int)  Direction to be sorted - "desc" or "asc".

    //If Sort Expression Exists
    if (iSortCols > 0)
    
        //Sorting
        string[] sSortDirection = new string[iSortCols]; // asc or desc
        Int32[] iSortColNum = new Int32[iSortCols]; //number

        //Get Sorting Parameters from MVC Controller
        for (int h = 0; h < iSortCols; h++)
        
            //Get Sort Direction
            var s1 = "sSortDir_" + h;
            sSortDirection[h] = Convert.ToString(Request[s1]);

            //Get Sort Column Number
            var s2 = "iSortCol_" + h;
            iSortColNum[h] = Convert.ToInt32(Request[s2]);

        

        //Build Orderby Statement
        for (int i = 0; i < iSortCols; i++)
        
            // We need to keep the loop index, not sure why it is altered by the Linq.
            var index = i;

            //If Current Column is Ascending/Descending
            if (sSortDirection[index] == "asc")
            
                //Orderby / Thenby
                orderedTags = (index == 0) ? filteredTags.OrderBy(t => getColName(t, iSortColNum[index]))
                                        : orderedTags.ThenBy(t => getColName(t, iSortColNum[index]));

            
            else
            
                orderedTags = (index == 0) ? filteredTags.OrderByDescending(t => getColName(t, iSortColNum[index]))
                                       : orderedTags.ThenByDescending(t => getColName(t, iSortColNum[index]));
            

        

        //Return Orderby LINQ to Original Result Variable
        filteredTags = orderedTags;
    
    else
    
        //Default Sort if None is Selected
        filteredTags = filteredTags.OrderBy(t => t.TAG);
    

【讨论】:

它是否适用于 DateTime 列?因为用户可以看到 dd.mm.yyyy 但您想按 yyyy.mm.dd 对其进行排序。

以上是关于C#如何将.OrderBy与多列一起使用并将列号解码为列名?的主要内容,如果未能解决你的问题,请参考以下文章

将 OrderBy 与 JPARepository 一起使用

获取从 C# (oracle) 调用的插入语句使用的序列号

如何在 Spring 中将 OrderBy 与 JPARepository 一起使用

groupby java

复杂的 OrderBy 使用多列

如何让C#中listview控件显示多行多列数据?