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 (это то, что подразумевает ваш пример кода).