2013-06-13 57 views
4

安裝.Net 4.5後,EF生成的查詢出現問題。在linq到.Net 4.0的相同查詢能夠正常工作。我正在使用Firebird數據庫,它不支持命令OUTER APPLY。有沒有辦法修改下面的查詢linq,以便它的行爲在.Net 4.5.net 4.5和實體框架中的其他應用程序

當前LINQ查詢:

int[] AROIds = (from x in context.RISK_T_ASSESS_HIST 
       where (x.ID_RISKOBJECT.HasValue && x.F_CREATEDON >= Freq.StartDate 
       && x.F_CREATEDON <= Freq.EndDate) 
       group x by x.ID_RISKOBJECT into gr 
       let lastCreated = gr.Max(p => p.F_CREATEDON) 
       select new 
       { 
       ObjId = gr.Key 
       , LastStatus = gr.Where(p => p.F_CREATEDON == lastCreated 
        && p.ID_RISKOBJECT == gr.Key) 
        .Select(p => p.F_STATUS).FirstOrDefault() 
       }).Where(x => x.LastStatus == 0 || x.LastStatus == 1) 
       .Select(x => x.ObjId.Value).ToArray(); 

SQL的產生。 Net 4.5:

SELECT 
"Project1"."ID_RISKOBJECT" AS "ID_RISKOBJECT" 
FROM (SELECT 
    "GroupBy1"."A1" AS "C1", 
    "GroupBy1"."K1" AS "ID_RISKOBJECT" 
    FROM (SELECT 
     "Extent1"."ID_RISKOBJECT" AS "K1", 
     MAX("Extent1"."F_CREATEDON") AS "A1" 
     FROM "RISK_T_ASSESS_HIST" AS "Extent1" 
     WHERE (("Extent1"."ID_RISKOBJECT" IS NOT NULL) 
     AND ("Extent1"."F_CREATEDON" >= 2013-04-17)) 
     AND ("Extent1"."F_CREATEDON" <= 2013-04-17) 
     GROUP BY "Extent1"."ID_RISKOBJECT" 
    ) AS "GroupBy1") AS "Project1" 
OUTER APPLY (SELECT FIRST (1) 
    "Extent2"."F_STATUS" AS "F_STATUS" 
    FROM "RISK_T_ASSESS_HIST" AS "Extent2" 
    WHERE (((("Extent2"."ID_RISKOBJECT" IS NOT NULL) 
    AND ("Extent2"."F_CREATEDON" >= 2013-04-17)) 
    AND ("Extent2"."F_CREATEDON" <= @2013-04-17)) 
    AND (("Project1"."ID_RISKOBJECT" = "Extent2"."ID_RISKOBJECT") OR (("Project1"."ID_RISKOBJECT" IS NULL) 
    AND ("Extent2"."ID_RISKOBJECT" IS NULL)))) AND (("Extent2"."F_CREATEDON" = "Project1"."C1") 
    AND ("Extent2"."ID_RISKOBJECT" = "Project1"."ID_RISKOBJECT"))) AS "Limit1" 
WHERE (0 = "Limit1"."F_STATUS") OR (1 = "Limit1"."F_STATUS") 
+1

*我使用的是Firebird數據庫,它不支持命令OUTER APPLY *聽起來像提供者的問題,你使用正確的嗎? –

+1

Dupe http://stackoverflow.com/questions/16650954/entity-framework-generates-different-queries-on-different-workstations,但我建議不要關閉這個問題,因爲其他問題基本上「不要安裝.NET 4.5「標記爲答案... – hvd

+0

我需要安裝.net 4.5。我可以讓EF工作在4.0下,即使它安裝在環境'.Net 4.5?' –

回答

1

好的。唯一的解決方案,這是我在初始表中閱讀時發現的。不幸的是,這並不完全是我的意思,但它的工作原理。

AIds = (from x in 
     (
      context.RISK_T_ASSESS_HIST.Where(x => x.ID_RISKOBJECT.HasValue && x.F_CREATEDON >= Freq.StartDate && x.F_CREATEDON <= Freq.EndDate) 
      .Select(x => new { x.ID_RISKOBJECT, x.F_CREATEDON, x.F_STATUS }).ToList() 
     )  
     group x by x.ID_RISKOBJECT into gr 
     let lastCreated = gr.Max(p => p.F_CREATEDON) 
     select new 
     { 
      ObjId = gr.Key 
      , 
      LastStatus = gr.Where(p => p.F_CREATEDON == lastCreated && p.ID_RISKOBJECT == gr.Key).Select(p => p.F_STATUS).FirstOrDefault() 
     }).Where(x => x.LastStatus == 0 || x.LastStatus == 1).Select(x => x.ObjId.Value).ToArray(); 

此問題實體框架將作爲錯誤在他們的論壇上傳遞。

相關問題