2015-10-21 13 views
0

У меня есть модель GetX (DataTableParameters), где model.Order содержит столбец (который может быть 1 (Id), 2 (Name) и т. Д.) И Dir (который может быть «asc» или «desc «). Тогда у меня есть запрос LINQ, где я бы хотел динамически генерировать OrderByDescending или OrderBy и r => r.Id или r => r.Name в зависимости от значений модели.Динамически генерировать LINQ

DbContext.Users.Where(r => r.FirstName.Contains(model.Search.Value) || 
          r.LastName.Contains(model.Search.Value) || 
          r.Email.Contains(model.Search.Value)) 
.**OrderByDescending(r => r.Id)**.Skip(model.Start).Take(model.Length); 

Это можно сделать? Если да, то кто-нибудь может указать мне в правильном направлении. Спасибо за любую помощь.

+1

Вы пробовали? Он работает почти так же, как вы его набрали. Каждая функция LINQ * возвращает * результат *. Вам не нужно связывать все из них, просто поместите результат из 'Where()' в переменную, примените любой метод 'OrderBy', который вы хотите, затем перейдите к результату' OrderBy' и примените остальные методы –

+0

Сделал это и застрял с большим количеством случаев if или switch, которые я хотел избежать. –

ответ

1

Используйте Dynamic Linq, есть несколько библиотек, которые помогут вам работать с ним. Я использую это, и это выглядит здорово, посмотрите здесь для получения дополнительной информации

Это развилка из старой библиотеки, которая была внезапно удалена, и это позволяет писать динамический код, как

var result = myQuery 
    .OrderBy("Field1 asc") 
    .Select("new (Field1, Field2)"); 

взгляните на http://web.archive.org/web/20160109203827/http://dynamiclinq.azurewebsites.net/ (документация для старой библиотеки), чтобы иметь хороший обзор.

+0

Только то, что я искал, это будет легко реализовать, так как у меня мало времени. Спасибо. –

1

Похоже, вы используете DataTables. У меня такой же сценарий, и я написал код, который использует PagedList nuget package для предоставления выгружаемых, отсортированных данных JSON для DataTables.

Использование выглядит следующим образом:

[HttpPost] 
public JsonResult GetJson(DataTablesParam param) 
{ 
    using (var context = new SalesContext()) 
    { 
     return context.Sales 
      .TrustedSortToPagedList(param.ToPagingCriteria()) 
      .Select(s => new SaleViewModel(s)) 
      .ToDataTableResult(param.Draw); 
    } 
} 

В JavaScript я включить этот параметр в DataTable конфигурации:

ajax: { 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    url: "@Url.Action("GetJson")", 
    type: "POST", 
    data: function(d) { 
     // add extra query parameters here 
     d.startDate = $("#startDate").val(); 
     d.endDate = $("#endDate").val(); 
     return JSON.stringify(d); 
    }, 
}, 

Полный код доступен в этом gist.

+0

Это действительно приятно, я буду переоценивать это, когда я получаю шанс, сейчас я просто возьму Linq. Dinamic. Спасибо. –

1
var query=DbContext 
    .Users 
    .Where(r => r.FirstName.Contains(model.Search.Value) || 
       r.LastName.Contains(model.Search.Value) || 
       r.Email.Contains(model.Search.Value)); 

switch(Model.Order) 
{ 
    case 1: 
    query=(Model.Dir=="asc")? 
     query.OrderBy(q=>q.id): 
     query.OrderByDescending(q=>q.id); 
    break; 
    case 2: 
    query=(Model.Dir=="asc")? 
     query.OrderBy(q=>q.Name): 
     query.OrderByDescending(q=>q.Name); 
    break; 
} 
query=query 
    .Skip(Model.Start) 
    .Take(Model.Length); 
+0

Я делал это так, но хотел получить более простое решение. Благодарю вас –

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