sql - 具有一对多关系和 orderby 复杂表达式的 Linq SQL 错误

标签 sql sql-server linq entity-framework-6 alias

我正在使用 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.



问题在于顶级选择中为 Project1.C2 提供的别名。它的别名为 C1,C1 是 Project1 子查询中另一列的别名。
删除第一个或第五个 ordery by 字段允许查询运行,但排序不正确。将别名重命名为其他名称允许查询运行并且排序是正确的。这是 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();

关于sql - 具有一对多关系和 orderby 复杂表达式的 Linq SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621102/

相关文章:

sql - 邮政编码前导零

mysql - 计算两个不同的列

sql - 如何在SQL Server中为group by构造索引

sql - 如何在 SQL Server 中将多行文本连接成单个文本字符串

c# - MySql LIMIT 1 子句的替代方案 - 不希望仅限于一个 RDBMS

c# - 获取嵌套在列表中的最大计数列表

c# - 如何查询 Azure CosmosDB/DocumentDB 中的字典内容?

mysql - 嵌套case语句sql

asp.net - 使用 SqlClient 命名空间类时,Glimpse 可以提供诊断吗

c# - 使用LINQ计算每一行的总和