2

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 による並べ替えはできません。

4

1 に答える 1