2017-10-13 2 views
1

DataTables ASP.NET을 사용하는 웹 API에서 DataTables Serverside 처리를 사용하고 있습니다. 그것은 좋은 일하지만 난 APIController 메서드에서 정렬을 처리하는 더 나은 방법을 찾고 싶어요. 지금은 if statements을 많이 사용하고 IDataTablesRequest.Column 필드 이름을 명시 적으로 참조하고 있지만 모든 필드와 테이블에 대해이 작업을 수행해야합니다. 내 코드는 아래 내 APIController 메서드는 datatables ajax get을 사용하여 호출됩니다. 코드의 request 개체는 DataTables ASP.NETIDataTablesRequest 요청입니다. 정렬 열이 여기에 전송됩니다.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); 
}