LINQ эквивалент моего SQL-запроса для UNION ALL

(SELECT * FROM SheetHay WHERE SheetStatus = 2)
 UNION ALL(SELECT * FROM SheetHay WHERE SheetStatus = 1)
 UNION ALL (SELECT * FROM SheetHay WHERE SheetStatus  = 0)
 UNION ALL(SELECT * FROM SheetHay WHERE SheetStatus= 3)

Я получаю набор результатов, как это:

Я имею в виду, что я получаю все "2" вместе, "0" вместе, "3" вместе (в таблице пока нет "1"). Но когда я использую LINQ и UNION их, я вижу результат в своей сетке в порядке SheetID, первичного ключа. Я имею в виду, я вижу порядок листов, отображаемых как 15,23,25,27,28,29 и т. Д. Но я хочу это так же, как набор результатов SQL 23,43,25,28 и т. Д.

IEnumerable<SheetHay> listTwos = Get(LINQ QUERY TO GET just twos);    
IEnumerable<SheetHay> listOnes = Get(LINQ QUERY TO GET just Ones);
IEnumerable<SheetHay> listZeros = Get(LINQ QUERY TO GET just  Zeros);
IEnumerable<SheetHay> listThrees = Get(LINQ QUERY TO GET just Threes);
....
    return listTwos.Union(listZeros).Union(listOnes).Union(listThrees);

Дайте мне знать, если вам нужна другая информация. Благодарю.

2 ответа

Решение

Вам не нужно использовать несколько запросов, которые вы можете использовать CASE в ORDER BY в sql и аналогичным образом в LINQ.

SQL:

SELECT * FROM SheetHay 
WHERE SheetStatus IN(0,1,2,3)) 
ORDER BY CASE SheetStatus 
    WHEN 2 THEN 1 
    WHEN 1 THEN 2 
    WHEN 0 THEN 3 
    WHEN 3 THEN 4 END ASC, SheetStatus ASC

LINQ:

int[] status =  {0, 1, 2, 3};
var query = db.SheetHay 
    .Where(s => status.Contains(s.SheetStatus))
    .OrderByDescending(s => s.SheetStatus == 2)
    .ThenByDescending(s =>  s.SheetStatus == 1)
    .ThenByDescending(s =>  s.SheetStatus == 0)
    .ThenByDescending(s =>  s.SheetStatus == 3)
    .ThenBy(s =>  s.SheetStatus);

По убыванию, потому что сравнение возвращает bool а также true "выше" чем false(1/0).

Вы также можете использовать условный оператор для возврата int для заказа:

var query = db.SheetHay 
    .Where(s => status.Contains(s.SheetStatus))
    .OrderBy(s => s.SheetStatus == 2 ? 0 : 1)
    .ThenBy(s =>  s.SheetStatus == 1 ? 0 : 1)
    .ThenBy(s =>  s.SheetStatus == 0 ? 0 : 1)
    .ThenBy(s =>  s.SheetStatus == 3 ? 0 : 1)
    .ThenBy(s =>  s.SheetStatus);

Как насчет этого:

IEnumerable<SheetHay> sheetHays =
    SheetHays
    .Where(x => x.SheetStatus < 3)
    .OrderByDescending(x => x.SheetStatus)
    .Concat(SheetsHays.Where(x => x.SheetStatus == 3));

Это основано на порядке 2, 1, 0, 3 (что демонстрирует ваш пример запроса). Это нужно будет изменить, если вы хотите, чтобы порядок 2, 0, 1, 3 (это то, что подразумевает ваш пример кода).

Другие вопросы по тегам