LINQ Concat 嵌套查询排序
LINQ Concat nested queries sorting
我有以下代码:
var comp = db.Companies.Select(x => new
{
topid = x.ID_comp,
hill = ((from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp
select new { h = company.ID_comp.ToString() })
.Concat((
from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp descending
select new { h = company.ID_comp.ToString() })))
.Select(y => y.h)
});
任务是为每个公司的 ID 构建 "pyramids" 个 ID:121
用于 3
,12321
用于 4
等等(如果有些公司的 ID 为 1、2、3 4)。给定查询的想法是将所有小于 current 的 id 分成 2 个集合,然后将它们连接起来,按降序排列第二个集合(金字塔的顶部重复,但我将 return 到它稍后)。
问题是 order by
子句没有对每个集合单独执行,最后我得到类似 1 2 3 1 2 3
的公司 ID 为 4 的东西。我如何订购嵌套的以不同的顺序查询?
UPD1:我使用的数据:
Table db.Companies
ID_comp | name
--------------------
1 |Don_avia
2 |Aeroflot
3 |Dale_avia
4 |air_France
5 |British_AW
输出:
1:
2: 1 1
3: 1 2 1 2
4: 1 2 3 1 2 3
5: 1 2 3 4 1 2 3 4
UPD2:结果查询:
SELECT
[Extent1].[ID_comp] AS [ID_comp],
[Project3].[C2] AS [C1],
[Project3].[C1] AS [C2]
FROM [dbo].[Company] AS [Extent1]
OUTER APPLY (SELECT
[UnionAll1].[C1] AS [C1],
1 AS [C2]
FROM (SELECT
CAST( [Extent2].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent2]
WHERE [Extent1].[ID_comp] > [Extent2].[ID_comp]
UNION ALL
SELECT
CAST( [Extent3].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent3]
WHERE [Extent1].[ID_comp] > [Extent3].[ID_comp]) AS [UnionAll1] ) AS [Project3]
ORDER BY [Extent1].[ID_comp] ASC, [Project3].[C2] ASC
var comp = db.Companies.Select(x => new
{
topid = x.ID_comp,
hill = ((from company in db.Companies.OrderBy(y => y.ID_comp)
where x.ID_comp > company.ID_comp
select new { h = company.ID_comp.ToString() })
.Concat((
from company in db.Companies.OrderByDescending(y => y.ID_comp)
where x.ID_comp > company.ID_comp
select new { h = company.ID_comp.ToString() })))
.Select(y => y.h)
});
您似乎遇到了 EF6 查询翻译错误 - .Concat
(SQL UNION ALL
) 子查询的排序被忽略。
我发现的解决方法是将 Take(int.MaxValue)
之类的假限制运算符附加到子查询,这会导致 EF6 考虑顺序:
hill =
(from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp
select new { h = company.ID_comp.ToString() }
).Take(int.MaxValue)
.Concat(
(from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp descending
select new { h = company.ID_comp.ToString() }
).Take(int.MaxValue))
.Select(y => y.h)
生成SQL:
SELECT
[Extent1].[ID_comp] AS [ID_comp],
[Project5].[C2] AS [C1],
[Project5].[C1] AS [C2]
FROM [dbo].[Company] AS [Extent1]
OUTER APPLY (SELECT
[UnionAll1].[C1] AS [C1],
1 AS [C2]
FROM (SELECT TOP (2147483647)
[Project1].[C1] AS [C1]
FROM ( SELECT
[Extent2].[ID_comp] AS [ID_comp],
CAST( [Extent2].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent2]
WHERE [Extent1].[ID_comp] > [Extent2].[ID_comp]
) AS [Project1]
ORDER BY [Project1].[ID_comp] ASC
UNION ALL
SELECT TOP (2147483647)
[Project3].[C1] AS [C1]
FROM ( SELECT
[Extent3].[ID_comp] AS [ID_comp],
CAST( [Extent3].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent3]
WHERE [Extent1].[ID_comp] > [Extent3].[ID_comp]
) AS [Project3]
ORDER BY [Project3].[ID_comp] DESC) AS [UnionAll1] ) AS [Project5]
ORDER BY [Extent1].[ID_comp] ASC, [Project5].[C2] ASC
我有以下代码:
var comp = db.Companies.Select(x => new
{
topid = x.ID_comp,
hill = ((from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp
select new { h = company.ID_comp.ToString() })
.Concat((
from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp descending
select new { h = company.ID_comp.ToString() })))
.Select(y => y.h)
});
任务是为每个公司的 ID 构建 "pyramids" 个 ID:121
用于 3
,12321
用于 4
等等(如果有些公司的 ID 为 1、2、3 4)。给定查询的想法是将所有小于 current 的 id 分成 2 个集合,然后将它们连接起来,按降序排列第二个集合(金字塔的顶部重复,但我将 return 到它稍后)。
问题是 order by
子句没有对每个集合单独执行,最后我得到类似 1 2 3 1 2 3
的公司 ID 为 4 的东西。我如何订购嵌套的以不同的顺序查询?
UPD1:我使用的数据:
Table db.Companies
ID_comp | name
--------------------
1 |Don_avia
2 |Aeroflot
3 |Dale_avia
4 |air_France
5 |British_AW
输出:
1:
2: 1 1
3: 1 2 1 2
4: 1 2 3 1 2 3
5: 1 2 3 4 1 2 3 4
UPD2:结果查询:
SELECT
[Extent1].[ID_comp] AS [ID_comp],
[Project3].[C2] AS [C1],
[Project3].[C1] AS [C2]
FROM [dbo].[Company] AS [Extent1]
OUTER APPLY (SELECT
[UnionAll1].[C1] AS [C1],
1 AS [C2]
FROM (SELECT
CAST( [Extent2].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent2]
WHERE [Extent1].[ID_comp] > [Extent2].[ID_comp]
UNION ALL
SELECT
CAST( [Extent3].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent3]
WHERE [Extent1].[ID_comp] > [Extent3].[ID_comp]) AS [UnionAll1] ) AS [Project3]
ORDER BY [Extent1].[ID_comp] ASC, [Project3].[C2] ASC
var comp = db.Companies.Select(x => new
{
topid = x.ID_comp,
hill = ((from company in db.Companies.OrderBy(y => y.ID_comp)
where x.ID_comp > company.ID_comp
select new { h = company.ID_comp.ToString() })
.Concat((
from company in db.Companies.OrderByDescending(y => y.ID_comp)
where x.ID_comp > company.ID_comp
select new { h = company.ID_comp.ToString() })))
.Select(y => y.h)
});
您似乎遇到了 EF6 查询翻译错误 - .Concat
(SQL UNION ALL
) 子查询的排序被忽略。
我发现的解决方法是将 Take(int.MaxValue)
之类的假限制运算符附加到子查询,这会导致 EF6 考虑顺序:
hill =
(from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp
select new { h = company.ID_comp.ToString() }
).Take(int.MaxValue)
.Concat(
(from company in db.Companies
where x.ID_comp > company.ID_comp
orderby company.ID_comp descending
select new { h = company.ID_comp.ToString() }
).Take(int.MaxValue))
.Select(y => y.h)
生成SQL:
SELECT
[Extent1].[ID_comp] AS [ID_comp],
[Project5].[C2] AS [C1],
[Project5].[C1] AS [C2]
FROM [dbo].[Company] AS [Extent1]
OUTER APPLY (SELECT
[UnionAll1].[C1] AS [C1],
1 AS [C2]
FROM (SELECT TOP (2147483647)
[Project1].[C1] AS [C1]
FROM ( SELECT
[Extent2].[ID_comp] AS [ID_comp],
CAST( [Extent2].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent2]
WHERE [Extent1].[ID_comp] > [Extent2].[ID_comp]
) AS [Project1]
ORDER BY [Project1].[ID_comp] ASC
UNION ALL
SELECT TOP (2147483647)
[Project3].[C1] AS [C1]
FROM ( SELECT
[Extent3].[ID_comp] AS [ID_comp],
CAST( [Extent3].[ID_comp] AS nvarchar(max)) AS [C1]
FROM [dbo].[Company] AS [Extent3]
WHERE [Extent1].[ID_comp] > [Extent3].[ID_comp]
) AS [Project3]
ORDER BY [Project3].[ID_comp] DESC) AS [UnionAll1] ) AS [Project5]
ORDER BY [Extent1].[ID_comp] ASC, [Project5].[C2] ASC