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 bool
和 true
是 "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);
(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 bool
和 true
是 "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);