私はこのDataTables ASP.NETを使用してWeb APIでDataTables Serverside処理を使用しています。これはうまくいきますが、私はAPIController
メソッドでソートを処理するより良い方法を見つけたいと思っています。今私は多くのif statements
を使用しており、IDataTablesRequest.Column
フィールド名を明示的に参照していますが、すべてのフィールドとテーブルでこれを行う必要があります。下のコードは、datatables
で呼び出されたAPIController
メソッドの中にajax getを使用しています。コード内のrequest
オブジェクトは、DataTables ASP.NETからのIDataTablesRequest
リクエストです。これでソート列が送信されます。ASP.NET列ソート用のDataTables
SortBy<>
でIEnumerable
拡張メソッドを使用してみましたが、this questionから機能しませんでした。
これは私が今すぐ並べ替えるために使用するコードです。フィールド名を明示的に使用する必要がないため、送信されたフィールドで並べ替えることができます。
var orderColums = request.Columns.Where(x => x.Sort != null);
var filteredData = deviceList.Where(_item => _item.UserName.Contains(request.Search.Value));
IColumn sortColumn = orderColums.FirstOrDefault();
var dataPage = new object();
if (sortColumn != null && sortColumn.Field == "dateCreated")
{
if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending)
{
dataPage = filteredData.OrderBy(o => o.DateCreated).Skip(request.Start).Take(request.Length);
}
else
{
dataPage = filteredData.OrderByDescending(o => o.DateCreated).Skip(request.Start).Take(request.Length);
}
}
else if (sortColumn != null && sortColumn.Field == "userName")
{
if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending)
{
dataPage = filteredData.OrderBy(o => o.UserName).Skip(request.Start).Take(request.Length);
}
else
{
dataPage = filteredData.OrderByDescending(o => o.UserName).Skip(request.Start).Take(request.Length);
}
}
else
{
dataPage = filteredData.Skip(request.Start).Take(request.Length);
}