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 SortingFarm 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 一起使用