LINQ相当于我对UNION ALL的SQL查询

时间:2015-04-29 14:06:30

标签: sql-server linq sql-order-by union equivalent

(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)

我得到的结果如下: enter image description here

我的意思是我把所有'2'放在一起,'0'在一起,'3'在一起(没有'1'在 桌子)。但是当我使用LINQ和UNION时,我在GridID上看到了结果,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 个答案:

答案 0 :(得分:3)

您不需要使用多个查询,您可以在SQL中的CASE中使用ORDER BY,在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);

降序因为比较返回booltrue高于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);

答案 1 :(得分:0)

这个怎么样:

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(这是你的示例代码所暗示的那样),则需要修改它。