2017-10-13 8 views
1

私はこの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); 
} 

答えて

1

reflectionを使用すると、フィールド名を知らずに列にアクセスできます。コードを使用した例を次に示します。

var orderColums = request.Columns.Where(x => x.Sort != null); 

var filteredData = deviceList.Where(_item => _item.UserName.Contains(request.Search.Value)); 

IColumn sortColumn = orderColums.FirstOrDefault(); 
string newField = ""; 
// Change first character to match column name 
newField += sortColumn.Field.ToUpper().First() + string.Join("", sortColumn.Field.Skip(1)); 
var dataPage = new object(); 
if (sortColumn != null) 
{ 
    if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending) 
    { 
     dataPage = filteredData.OrderBy(o => o.GetType().GetProperty(newField).GetValue(o)) 
      .Skip(request.Start) 
      .Take(request.Length); 
    } 
    else 
    { 
     dataPage = filteredData.OrderByDescending(o => o.GetType().GetProperty(newField).GetValue(o)) 
      .Skip(request.Start) 
      .Take(request.Length); 
    } 
} 
else 
{ 
    dataPage = filteredData.Skip(request.Start).Take(request.Length); 
} 
関連する問題