2014-12-05 3 views
0

У меня есть небольшая проблема. В настоящее время я пытаюсь написать динамический порядок по запросу с помощью linq.LINQ - Динамический порядок по выражению

Sql запрос, который я пытаюсь реализовать в LINQ

select * from tbl 
order by case when Location='Loc9787f85b-c953-4238-8bad-f712b6444443' then 1 
when Location='Loc9787f85b-c953-4238-8bad-f712b6444442' then 2 end 

значение Расположение будет извлекается и сохраняется в списке. Он может иметь одно или несколько значений.

Это решение работает для определения статического местоположения. Поскольку я извлекаю значение местоположения динамически, я не знал, как реализовать значение динамического местоположения.

var temp = tbl.OrderBy(t => t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444443' ? 
1 : (t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444442' ? 2 : 3)) 

Я буду получение местоположения с помощью этого куска кода:

List<String> Location = CustomerService.GetAllLocation(); 

Я пытаюсь сделать заказ, используя этот список значения. Можно ли реализовать динамический порядок, используя список, содержащий значение столбца?

+0

Я буду с извлечением местоположение с помощью этого фрагмента кода: Список Местоположение = CustomerService.GetAllLocation(); Я пытаюсь заказать, используя эти значения списка. –

ответ

0

Использование

List<String> locations = CustomerService.GetAllLocation(); 
var ordered = tbl.OrderBy(t => locations.Contains(t.Location) ? 0 : 1); 

или, если индекс должен представлять приоритет:

var ordered = tbl 
    .Where(t => locations.Contains(t.Location)) 
    .ToList() //because List.IndexOf is not supported in LINQ-TO-SQL 
    .OrderBy(t => locations.IndexOf(t.Location)); 
+0

Спасибо за ваш ответ. да, индекс является приоритетом. Решение # 1, похоже, не выполняет порядок должным образом. Я получаю несоответствие с заказами, но работает с подкачкой linq. Решение # 2 Это работает для меня. В настоящее время я выполнил linq пейджинг, используя skip и take. С помощью этого кода я в конечном итоге получаю все строки из таблицы и выполняя порядок после этого. Есть ли возможность реализовать оба порядка со списком строк и подкачки linq, используя skip и take? –

+0

@DuraiPandian: первый только знает 1 или 0, поэтому у вас есть две группы. Последний заказывает по индексу позиции в списке. Поскольку это не поддерживается LINQ-TO-SQL, я внедрил запрос в список. Но поскольку фильтр применяется сначала, производительность должна быть приемлемой (зависит от количества совпадений). Skip и Take также работает в LINQ-TO-Objects (поэтому после 'ToList'). У меня еще нет времени для поиска подхода, который работает в базе данных, возможно, вам нужно сначала вставить его в временную таблицу. –

+0

Большое вам спасибо. Последний порядок работает отлично для меня. –

0

Вместо подтолкнуть логику к способу, как так:

var temp = tbl.OrderBy(t => GetOrder(t)); 

public int GetOrder(LocationObject t) 
{ 
    int returnValue = 0; 
    if (t.Location== "Loc9787f85b-c953-4238-8bad-f712b6444443") 
    { 
    returnValue = 1; 
    } 
    else if (t.Location == "Loc9787f85b-c953-4238-8bad-f712b6444442") 
    { 
    returnValue = 2; 
    } 
    else 
    { 
    returnValue = 3; 
    } 
    return returnValue; 
} 
+0

Я получаю исключение «LINQ to Entities не распознает метод« Int32 GetOrder (LocationObject) », и этот метод не может быть переведен в выражение хранилища». Плюс, у меня есть значение местоположения в списке, который я пытаюсь несколько обходить вокруг, чтобы генерировать порядок по запросу. –

+0

'LocationObject' как тип означал как заполнитель для любого типа' t' на самом деле (вы никогда не указывали его в своем коде). – toadflakz