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

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

从 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 表达式的基本要点是什么?

【问题讨论】:

标签: c# linq ienumerable jquery-datatables


【解决方案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://stackoverflow.com/questions/958220/how-can-i-use-linq-to-sort-by-multiple-fields
        //http://stackoverflow.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 对其进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2017-09-10
  • 1970-01-01
  • 2018-04-21
  • 2020-09-09
  • 2020-05-01
相关资源
最近更新 更多