一对多关系和 orderby 复杂表达式的 Linq SQL 错误
Linq SQL error with one-to-many relationship and orderby complex expression
我正在使用 Entity Framework v6.1.3。这个 Linq 语句:
return _context.Postings
.Where(p => p.dateToBeRemoved >= asOf)
.Include(p => p.Region)
.Include(p => p.Positions)
.OrderByDescending(p => p.oldVacancyId ?? int.MaxValue)
.ThenByDescending(p => p.postingNumber);
产生这个 SQL:
SELECT
[Project1].[postingId] AS [postingId],
[Project1].[regionId1] AS [regionId1],
<--- lines removed for brevity -->
[Project1].[C2] AS [C1]
FROM ( SELECT
CASE WHEN ([Extent1].[oldVacancyId] IS NULL) THEN 2147483647 ELSE [Extent1].[oldVacancyId] END AS [C1],
[Extent1].[postingId] AS [postingId],
[Extent2].[regionId] AS [regionId1],
<--- lines removed for brevity -->
CASE WHEN ([Extent3].[postingPositionId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM [dbo].[Postings] AS [Extent1]
LEFT OUTER JOIN [dbo].[Regions] AS [Extent2] ON [Extent1].[regionId] = [Extent2].[regionId]
LEFT OUTER JOIN [dbo].[PostingPositions] AS [Extent3] ON [Extent1].[postingId] = [Extent3].[postingId]
WHERE [Extent1].[dateToBeRemoved] >= '2016/6/3'
) AS [Project1]
ORDER BY [Project1].[C1] DESC, [Project1].[postingNumber] DESC, [Project1].[postingId] ASC, [Project1].[regionId1] ASC, [Project1].[C2] ASC
当 运行:
时抛出这个错误
A column has been specified more than once in the order by list.
Columns in the order by list must be unique.
问题出在顶层 select 中为 Project1.C2 指定的别名。它是 C1 的别名,C1 是 Project1 子查询中另一列的别名。
按字段删除第一个或第五个排序允许查询 运行,但排序不正确。将别名重命名为其他名称允许查询 运行 并且排序正确。这是 Linq 中的错误吗?关于如何解决这个问题有什么建议吗?
编辑
这里是我的问题的最小演示。给定这三个表:
Dogs
-------------------------
dogId int NOT NULL
dogName varchar NOT NULL
groomerId int NULL
Groomers
----------------------------
groomerId int NOT NULL
groomerName varchar NOT NULL
Fleas
----------------------------
fleaId int NOT NULL
fleaName varchar NOT NULL
hostDogId int NOT NULL
一只狗可能有也可能没有美容师,并且可能有 0 到很多跳蚤。
然后像这样的 linq 查询:
_context.Dogs
.Include(d => d.Fleas)
.OrderBy(d => d.groomerId.HasValue);
生成的 SQL 将包含一个带有 2 个复杂表达式的内部查询 - 一个表示狗是否有美容师,另一个表示它是否有跳蚤。这两个表达式都被赋予一个别名(分别为 C1 和 C2)。该内部查询包含一个外部查询,该外部查询引用 C2 并为其指定别名 C1。然后将 C1 和 C2 都放入 order by 子句中,但是 SQL 对哪个 C1 导致上述错误感到困惑。
我无法在单个 linq 语句中解决这个问题。我现在的解决方法是 运行 没有我的 order by 子句的查询并输出一个列表。然后在第二个语句中,将 order by 子句应用于该列表。
var dogs = _context.Dogs.Include(d => d.Fleas).ToList();
dogs = dogs.OrderBy(d => d.groomerId.HasValue).ToList();
我正在使用 Entity Framework v6.1.3。这个 Linq 语句:
return _context.Postings
.Where(p => p.dateToBeRemoved >= asOf)
.Include(p => p.Region)
.Include(p => p.Positions)
.OrderByDescending(p => p.oldVacancyId ?? int.MaxValue)
.ThenByDescending(p => p.postingNumber);
产生这个 SQL:
SELECT
[Project1].[postingId] AS [postingId],
[Project1].[regionId1] AS [regionId1],
<--- lines removed for brevity -->
[Project1].[C2] AS [C1]
FROM ( SELECT
CASE WHEN ([Extent1].[oldVacancyId] IS NULL) THEN 2147483647 ELSE [Extent1].[oldVacancyId] END AS [C1],
[Extent1].[postingId] AS [postingId],
[Extent2].[regionId] AS [regionId1],
<--- lines removed for brevity -->
CASE WHEN ([Extent3].[postingPositionId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM [dbo].[Postings] AS [Extent1]
LEFT OUTER JOIN [dbo].[Regions] AS [Extent2] ON [Extent1].[regionId] = [Extent2].[regionId]
LEFT OUTER JOIN [dbo].[PostingPositions] AS [Extent3] ON [Extent1].[postingId] = [Extent3].[postingId]
WHERE [Extent1].[dateToBeRemoved] >= '2016/6/3'
) AS [Project1]
ORDER BY [Project1].[C1] DESC, [Project1].[postingNumber] DESC, [Project1].[postingId] ASC, [Project1].[regionId1] ASC, [Project1].[C2] ASC
当 运行:
时抛出这个错误A column has been specified more than once in the order by list. Columns in the order by list must be unique.
问题出在顶层 select 中为 Project1.C2 指定的别名。它是 C1 的别名,C1 是 Project1 子查询中另一列的别名。 按字段删除第一个或第五个排序允许查询 运行,但排序不正确。将别名重命名为其他名称允许查询 运行 并且排序正确。这是 Linq 中的错误吗?关于如何解决这个问题有什么建议吗?
编辑
这里是我的问题的最小演示。给定这三个表:
Dogs
-------------------------
dogId int NOT NULL
dogName varchar NOT NULL
groomerId int NULL
Groomers
----------------------------
groomerId int NOT NULL
groomerName varchar NOT NULL
Fleas
----------------------------
fleaId int NOT NULL
fleaName varchar NOT NULL
hostDogId int NOT NULL
一只狗可能有也可能没有美容师,并且可能有 0 到很多跳蚤。
然后像这样的 linq 查询:
_context.Dogs
.Include(d => d.Fleas)
.OrderBy(d => d.groomerId.HasValue);
生成的 SQL 将包含一个带有 2 个复杂表达式的内部查询 - 一个表示狗是否有美容师,另一个表示它是否有跳蚤。这两个表达式都被赋予一个别名(分别为 C1 和 C2)。该内部查询包含一个外部查询,该外部查询引用 C2 并为其指定别名 C1。然后将 C1 和 C2 都放入 order by 子句中,但是 SQL 对哪个 C1 导致上述错误感到困惑。
我无法在单个 linq 语句中解决这个问题。我现在的解决方法是 运行 没有我的 order by 子句的查询并输出一个列表。然后在第二个语句中,将 order by 子句应用于该列表。
var dogs = _context.Dogs.Include(d => d.Fleas).ToList();
dogs = dogs.OrderBy(d => d.groomerId.HasValue).ToList();