gpt4 book ai didi

LINQ 生成不正确的 SQL

转载 作者:行者123 更新时间:2023-12-04 04:50:17 25 4
gpt4 key购买 nike

根据entityframework.codeplex.com 的建议,我发布了带有标签entity-framework 的这个问题。 .

数据库:PostgreSQL 9.1
驱动程序:Npgsql 2.0.12

LINQ 查询:

var q1 = customerComplaints
.Where(x => x.ParentId == null)
.Except(customerComplaints
.Where(x => customerComplaints
.Any(c => (c.ParentId == x.Id))));

var q2 =
(from a in customerComplaints
join b in
(customerComplaints.Where(a => a.ParentId != null)
.GroupBy(a => a.ParentId)
.Select(b => new { ParentId = b.Key, CreatedDate = b.Max(t => t.CreatedDate) }))
on a.ParentId equals b.ParentId
where a.CreatedDate == b.CreatedDate
select a);

q1 = q1.Union(q2);

// Apply Sorting

if (string.IsNullOrEmpty(sorting) || sorting.Equals("CustomerName ASC")) {
q1 = q1.OrderBy(p => p.Customer.Name);
} else if (sorting.Equals("CustomerName DESC")) {
q1 = q1.OrderByDescending(p => p.Customer.Name);
} else if (sorting.Equals("ManagerName ASC")) {
q1 = q1.OrderBy(p => p.Manager.LastName);
} else if (sorting.Equals("ManagerName DESC")) {
q1 = q1.OrderByDescending(p => p.Manager.LastName);
} else if (sorting.Equals("AssignedName ASC")) {
q1 = q1.OrderBy(p => p.Assigned.LastName);
} else if (sorting.Equals("AssignedName DESC")) {
q1 = q1.OrderByDescending(p => p.Assigned.LastName);
} else if (sorting.Equals("StatusName ASC")) {
q1 = q1.OrderBy(p => p.StatusId);
} else if (sorting.Equals("StatusName DESC")) {
q1 = q1.OrderByDescending(p => p.StatusId);
} else if (sorting.Equals("ComplaintType ASC")) {
q1 = q1.OrderBy(p => p.ComplaintTypeId);
} else if (sorting.Equals("ComplaintType DESC")) {
q1 = q1.OrderByDescending(p => p.ComplaintTypeId);
} else if (sorting.Equals("CreatedDate ASC")) {
q1 = q1.OrderBy(p => p.CreatedDate);
} else if (sorting.Equals("CreatedDate DESC")) {
q1 = q1.OrderByDescending(p => p.CreatedDate);
}

// Perform paging and execute query
var result = q1.Skip(startIndex).Take(pageSize).ToList();

结果 SQL
SELECT 
"Limit1"."C1" AS "C1"
"Limit1"."C2" AS "C2"
"Limit1"."C3" AS "C3"
"Limit1"."C4" AS "C4"
"Limit1"."C5" AS "C5"
"Limit1"."C6" AS "C6"
"Limit1"."C7" AS "C7"
"Limit1"."C8" AS "C8"
"Limit1"."C9" AS "C9"
"Limit1"."C10" AS "C10"
"Limit1"."C11" AS "C11"
"Limit1"."C12" AS "C12"
"Limit1"."C13" AS "C13"
"Limit1"."C14" AS "C14"
"Limit1"."C15" AS "C15"
"Limit1"."C16" AS "C16"
"Limit1"."C17" AS "C17"
"Limit1"."C18" AS "C18"
"Limit1"."C19" AS "C19"
"Limit1"."C20" AS "C20"
"Limit1"."C21" AS "C21"
"Limit1"."C22" AS "C22"
FROM
(SELECT DISTINCT
"UnionAll1"."C1" AS "C1"
"UnionAll1"."C2" AS "C2"
"UnionAll1"."C3" AS "C3"
"UnionAll1"."C4" AS "C4"
"UnionAll1"."C5" AS "C5"
"UnionAll1"."C6" AS "C6"
"UnionAll1"."C7" AS "C7"
"UnionAll1"."C8" AS "C8"
"UnionAll1"."C9" AS "C9"
"UnionAll1"."C10" AS "C10"
"UnionAll1"."C11" AS "C11"
"UnionAll1"."C12" AS "C12"
"UnionAll1"."C13" AS "C13"
"UnionAll1"."C14" AS "C14"
"UnionAll1"."C15" AS "C15"
"UnionAll1"."C16" AS "C16"
"UnionAll1"."C17" AS "C17"
"UnionAll1"."C18" AS "C18"
"UnionAll1"."C19" AS "C19"
"UnionAll1"."C20" AS "C20"
"UnionAll1"."C21" AS "C21"
"UnionAll1"."C22" AS "C22"
FROM
(SELECT
"Except1"."Id" AS "C1"
"Except1"."ManagerId" AS "C2"
"Except1"."AssignedId" AS "C3"
"Except1"."ComplaintTypeId" AS "C4"
"Except1"."RootCauseId" AS "C5"
"Except1"."StatusId" AS "C6"
"Except1"."ResultingFromId" AS "C7"
"Except1"."RespParty" AS "C8"
"Except1"."Condition" AS "C9"
"Except1"."Containment" AS "C10"
"Except1"."CorrectiveAction" AS "C11"
"Except1"."ProductRejected" AS "C12"
"Except1"."IssueDate" AS "C13"
"Except1"."DueDate" AS "C14"
"Except1"."Approved" AS "C15"
"Except1"."ApprovedById" AS "C16"
"Except1"."ApprovedDate" AS "C17"
"Except1"."RejectionDetail" AS "C18"
"Except1"."Parent" AS "C19"
"Except1"."ParentId" AS "C20"
"Except1"."CreatedDate" AS "C21"
"Except1"."CreatedId" AS "C22"
FROM
(SELECT
"Extent1"."Id" AS "Id",
"Extent1"."ManagerId" AS "ManagerId",
"Extent1"."AssignedId" AS "AssignedId",
"Extent1"."ComplaintTypeId" AS "ComplaintTypeId",
"Extent1"."RootCauseId" AS "RootCauseId",
"Extent1"."StatusId" AS "StatusId",
"Extent1"."ResultingFromId" AS "ResultingFromId",
"Extent1"."RespParty" AS "RespParty",
"Extent1"."Condition" AS "Condition",
"Extent1"."Containment" AS "Containment",
"Extent1"."CorrectiveAction" AS "CorrectiveAction",
"Extent1"."ProductRejected" AS "ProductRejected",
"Extent1"."IssueDate" AS "IssueDate",
"Extent1"."DueDate" AS "DueDate",
"Extent1"."Approved" AS "Approved",
"Extent1"."ApprovedById" AS "ApprovedById",
"Extent1"."ApprovedDate" AS "ApprovedDate",
"Extent1"."RejectionDetail" AS "RejectionDetail",
"Extent1"."Parent" AS "Parent",
"Extent1"."ParentId" AS "ParentId",
"Extent1"."CreatedDate" AS "CreatedDate",
"Extent1"."CreatedId" AS "CreatedId"
FROM
"dbo"."CorrectiveActionRequest" AS "Extent1"
WHERE
"Extent1"."ParentId" IS NULL
EXCEPT
SELECT
"Extent2"."Id" AS "Id",
"Extent2"."ManagerId" AS "ManagerId",
"Extent2"."AssignedId" AS "AssignedId",
"Extent2"."ComplaintTypeId" AS "ComplaintTypeId",
"Extent2"."RootCauseId" AS "RootCauseId",
"Extent2"."StatusId" AS "StatusId",
"Extent2"."ResultingFromId" AS "ResultingFromId",
"Extent2"."RespParty" AS "RespParty",
"Extent2"."Condition" AS "Condition",
"Extent2"."Containment" AS "Containment",
"Extent2"."CorrectiveAction" AS "CorrectiveAction",
"Extent2"."ProductRejected" AS "ProductRejected",
"Extent2"."IssueDate" AS "IssueDate",
"Extent2"."DueDate" AS "DueDate",
"Extent2"."Approved" AS "Approved",
"Extent2"."ApprovedById" AS "ApprovedById",
"Extent2"."ApprovedDate" AS "ApprovedDate",
"Extent2"."RejectionDetail" AS "RejectionDetail",
"Extent2"."Parent" AS "Parent",
"Extent2"."ParentId" AS "ParentId",
"Extent2"."CreatedDate" AS "CreatedDate",
"Extent2"."CreatedId" AS "CreatedId"
FROM
"dbo"."CorrectiveActionRequest" AS "Extent2"
WHERE EXISTS
(SELECT
1 AS "C1"
FROM
"dbo"."CorrectiveActionRequest" AS "Extent3"
WHERE
"Extent3"."ParentId"="Extent2"."Id")) AS "Except1"
UNION ALL
SELECT
"Extent4"."Id" AS "Id",
"Extent4"."ManagerId" AS "ManagerId",
"Extent4"."AssignedId" AS "AssignedId",
"Extent4"."ComplaintTypeId" AS "ComplaintTypeId",
"Extent4"."RootCauseId" AS "RootCauseId",
"Extent4"."StatusId" AS "StatusId",
"Extent4"."ResultingFromId" AS "ResultingFromId",
"Extent4"."RespParty" AS "RespParty",
"Extent4"."Condition" AS "Condition",
"Extent4"."Containment" AS "Containment",
"Extent4"."CorrectiveAction" AS "CorrectiveAction",
"Extent4"."ProductRejected" AS "ProductRejected",
"Extent4"."IssueDate" AS "IssueDate",
"Extent4"."DueDate" AS "DueDate",
"Extent4"."Approved" AS "Approved",
"Extent4"."ApprovedById" AS "ApprovedById",
"Extent4"."ApprovedDate" AS "ApprovedDate",
"Extent4"."RejectionDetail" AS "RejectionDetail",
"Extent4"."Parent" AS "Parent",
"Extent4"."ParentId" AS "ParentId",
"Extent4"."CreatedDate" AS "CreatedDate",
"Extent4"."CreatedId" AS "CreatedId"
FROM
"dbo"."CorrectiveActionRequest" AS "Extent4"
INNER JOIN
(SELECT
"Extent5"."ParentId" AS "K1",
CAST
(max("Extent5"."CreatedDate") AS timestamp) AS "A1"
FROM
"dbo"."CorrectiveActionRequest" AS "Extent5"
WHERE
"Extent5"."ParentId" IS NOT NULL
GROUP BY
"Extent5"."ParentId") AS "GroupBy1"
ON
(("Extent4"."ParentId"="GroupBy1"."K1")
OR
(("Extent4"."ParentId" IS NULL )
AND
("GroupBy1"."K1" IS NULL )))
AND
("Extent4"."CreatedDate"="GroupBy1"."A1")) AS "UnionAll1") AS "Limit1"
ORDER BY "Distinct1"."C7" ASC
OFFSET 0
LIMIT 10

罪魁祸首在最后:
("Extent4"."CreatedDate"="GroupBy1"."A1")) AS "UnionAll1") AS "Limit1" 
ORDER BY "Distinct1"."C7" ASC
OFFSET 0
LIMIT 10

它试图通过 Distinct1 订购但是在生成的 SQL 查询中的其他任何地方都不存在这样的标识符。我已经尝试调试了几天,并注意到它取决于我选择的排序方式。例如,按 Customer.Name 排序将产生一个工作查询。按 CreatedDate 排序不会。

最佳答案

这可能意味着 LIMIT1。看起来您正在使用 MySQL 并且 MySQL 驱动程序有一个错误。我会检查以确保您的驱动程序是最新的,或者向他们提交错误。

关于LINQ 生成不正确的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17531616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com