2015-02-16 2 views
3

Так что название, вероятно, не имеет никакого смысла ...Linq OrderBy конкретные значения не приказывать в группировках

У меня есть список продуктов

"Ind Apples", "Ind Bananas", "Ind Carrots", "Ind Dates", "Ind Eggplants", "Bulk Apples", "Bulk Bananas", "Bulk Carrots", "Bulk Dates", "Potatoes", "Oranges", "Melons" 

мой запрос LINQ следующим образом:

var query = db.products 
    .OrderBy(c => c.ProductName.StartsWith("Ind")) 
    .ThenBy(c => c.ProductName.StartsWith("Bulk")); 

Я хочу, чтобы мой список сначала показывал все предметы, которые начинаются с «Ind», а затем предметы, начинающиеся с «Bulk», а затем все остальное ...

Что я получаю в моем списке является следующее:

"Ind Bananas" 
"Ind Eggplants" 
"Ind Carrots" 
"Ind Apples" 
"Bulk Apples" 
"Bulk Dates" 
"Bulk Carrots" 
"Bulk Bananas" 
"Oranges" 
"Melons" 
"Potatoes" 

поэтому заказывает моей спецификации ... но внутри каждой группировки «Ind», «Магистральный» это не ... Есть способ (кроме перехода через список и вручную указать, где я хочу каждый элемент), чтобы достичь этого в linq ????

ответ

0

Попробуйте следующее:

OrderByDescending(c => c.FruitType.StartsWith("Ind")).ThenBy(c => c).ThenBy(c => c.FruitType.StartsWith("Bulk")); 

.ThenBy (с => с) в середине должна обеспечивать алфавитный вид.

+0

Я извиняюсь за постановку мой ответ как вопрос. Я обращу внимание на это. –

+0

Да. Я также указал .ThenBy (c => c.ProductName) в конце, и это не сработало. – jonahpup

+0

Это как будто мне нужно сделать orderby INSIDE каждый из orderbys, которые уже есть, но вы не можете ... – jonahpup

2

Я бы цепь условных операторов во внешней группировке, то просто группа в строке:

var query = db.products 
       .OrderBy(c => c.ProductName.StartsWith("Ind") ? 0 : 
          c.ProductName.StartsWith("Bulk") ? 1 : 2) 
       .ThenBy(c => c.ProductName); 

или

var query = db.products 
       .OrderBy(c => c.ProductName.StartsWith("Ind") ? 0 : 1) 
       .ThenBy(c => c.ProductName.StartsWith("Bulk") ? 0 : 1) 
       .ThenBy(c => c.ProductName);