LINQ 相当于我的 SQL 查询 UNION ALL

LINQ equivalent of my SQL Query for 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” table 还没有)。但是,当我使用 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);

如果您需要任何其他信息,请告诉我。谢谢

这个怎么样:

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(这是您的示例代码所暗示的),则需要对此进行修改。

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

降序因为比较 returns booltrue 是 "higher" 而不是 false(1/0)。

您还可以使用条件运算符对 return 和 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);