根据 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 排序不会。