2016-06-12 2 views
0

Я работаю над существующим проектом, который использует asp.net webapi, я новичок в Linq, и вся команда, написавшая код проекта, ушла.динамическая сортировка для функции выражения linq

У меня есть Funtion в Web API controlller так:

public IQueryable<AccessTypeDTO> GetAccessTypes(int pageIndex = 1, int pageSize = 25) 
{ 
    var model = db.AccessTypes.AsQueryable(); 
    return model.Select(AccessTypeDTO.SELECT).Take(pageSize); 
} 

В AccessTypeDTO с нашей точки зрения модели и у нас есть модель предметной области базируется EF

AccessType DM выглядит следующим образом:

public partial class AccessType 
{ 
    public int AccessTypeID { get; set; } 
    public string AccessTypeName { get; set; } 
} 

Отображение и получение данных для AccessTypeDTO VM следующим образом

public class AccessTypeDTO 
{ 
    public int AccessTypeID { get; set; } 
    public string AccessTypeName { get; set; } 

    public static System.Linq.Expressions.Expression<Func<AccessType, AccessTypeDTO>> SELECT = 
      x => new AccessTypeDTO 
      { 
       AccessTypeID = x.AccessTypeID, 
       AccessTypeName = x.AccessTypeName 
      }; 
} 

Моя новая задача по реализации пейджинга и порядку результатов, поэтому мой веб-функция API должна выглядеть следующим образом:

public IQueryable<AccessTypeDTO> GetAccessTypes(int pageIndex = 1, int pageSize = 25, string orderBy = "AccessTypeID") 
{ 
    var collection= db.AccessTypes.AsQueryable(); 

    return collection.Select(AccessTypeDTO.SELECT).Skip((pageIndex - 1) * pageSize).Take(pageSize); 
} 

Основная проблема заключается в функции Я здание, что функция Skip требует, чтобы сбор «сбор» был отсортирован перед пропуском. Итак, как я могу сортировать эту коллекцию? Обратите внимание, что у меня есть более ста контроллеров, которые необходимо обновить, и у вас есть подкачка и сортировка подобным образом, и у меня нет времени писать службу для каждого контроллера и записывать переключатель для каждого столбца, чтобы сортировать

ответ

0

как это может помочь вам:

public static class MyLinqExtensions 
{ 
    public static IQueryable<AccessTypeDto> GetPage(this IQueryable<AccessType> source, int pageIndex, int pageSize) 
    { 
     return source.Select(x => new AccessTypeDto() 
     { 
      AccessTypeID = x.AccessTypeID, 
      AccessTypeName = x.AccessTypeName 
     }).OrderBy(x => x.AccessTypeID).Skip(pageIndex*pageSize).Take(pageSize); 
    } 
} 

и вы можете использовать его на вашей коллекции, как это:

collection.GetPage(1,25); 

надеюсь, что это поможет!

Edit:

вы можете изменить способ, как это:

public static IQueryable<AccessTypeDto> GetPage(this IQueryable<AccessType> source, int pageIndex, int pageSize, Expression<Func<AccessTypeDto,object>> predicate) 
    { 
     return source.Select(x => new AccessTypeDto() 
     { 
      AccessTypeID = x.AccessTypeID, 
      AccessTypeName = x.AccessTypeName 
     }).OrderBy(predicate).Skip(pageIndex * pageSize).Take(pageSize); 
    } 

, а затем вы можете вызвать метод, например:

collection.GetPage(1,25,x=>x.AccessTypeId); 

или

collection.GetPage(0,25,x=>x.AccessTypeId); 

Относительно (pageIndex -1) - Я предпочитаю начинать с pageIndex = 0, и таким образом мне не нужно иметь -1.

+0

спасибо дорогой. Я думаю, что пропуск должен быть: .Skip ((pageIndex - 1) * pageSize) .Take (pageSize); Как я могу сделать заказ по полю? – Mohammad

Смежные вопросы