2013-05-20 7 views
6

हमें एकल डेवलपर मशीन और कुछ क्लाइंट पर समस्या है। एकल लिंक क्वेरी दो अलग-अलग SQL क्वेरी उत्पन्न करती है। समस्या वास्तव में है कि दूसरी क्वेरी में "बाहरी आवेदन" कथन है जो फ़ायरबर्ड का समर्थन नहीं करता है। हमें लगता है कि यह कोड मुद्दा नहीं है, लेकिन पर्यावरणीय मुद्दा है, लेकिन मैं कोड पेस्ट कर दूंगा।इकाई फ्रेमवर्क विभिन्न वर्कस्टेशन पर विभिन्न प्रश्न उत्पन्न करता है

LINQ: बाहरी साथ

AIds = (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(); 

एसक्यूएल लागू

SELECT 
"G"."ID_RISKOBJECT" AS "ID_RISKOBJECT" 
FROM (SELECT 
    "C"."A1" AS "C1", 
    "C"."K1" AS "ID_RISKOBJECT" 
    FROM (SELECT 
     "E"."ID_RISKOBJECT" AS "K1", 
     MAX("E"."F_CREATEDON") AS "A1" 
     FROM "RISK_T_ASSESS_HIST" AS "E" 
     WHERE (("E"."ID_RISKOBJECT" IS NOT NULL) AND ("E"."F_CREATEDON" >=  @p__linq__0)) AND ("E"."F_CREATEDON" <= @p__linq__1)  
     GROUP BY "E"."ID_RISKOBJECT" 
    ) AS "C") AS "G" 
OUTER APPLY (SELECT FIRST (1) 
    "I"."F_STATUS" AS "F_STATUS" 
    FROM "RISK_T_ASSESS_HIST" AS "I" 
    WHERE (((("I"."ID_RISKOBJECT" IS NOT NULL) AND ("I"."F_CREATEDON" >=  @p__linq__0)) AND ("I"."F_CREATEDON" <= @p__linq__1)) AND (("G"."ID_RISKOBJECT" =   "I"."ID_RISKOBJECT") OR (("G"."ID_RISKOBJECT" IS NULL) AND ("I"."ID_RISKOBJECT" IS  NULL)))) AND (("I"."F_CREATEDON" = "G"."C1") AND ("I"."ID_RISKOBJECT" =  "G"."ID_RISKOBJECT"))) AS "J"  
WHERE (0 = "J"."F_STATUS") OR (1 = "J"."F_STATUS") 

कार्य एसक्यूएल

SELECT 
"B"."ID_RISKOBJECT" AS "ID_RISKOBJECT" 
FROM (SELECT 
     "C"."ID_RISKOBJECT" AS "ID_RISKOBJECT", 
     (SELECT FIRST (1) 
      "I"."F_STATUS" AS "F_STATUS" 
       FROM "RISK_T_ASSESS_HIST" AS "I" 
     WHERE (((("I"."ID_RISKOBJECT" IS NOT NULL) AND ("I"."F_CREATEDON" >= @p__linq__0)) AND ("I"."F_CREATEDON" <= @p__linq__1)) AND (("C"."ID_RISKOBJECT" = "I"."ID_RISKOBJECT") OR (("C"."ID_RISKOBJECT" IS NULL) AND ("I"."ID_RISKOBJECT" IS NULL)))) AND (("I"."F_CREATEDON" = "C"."C1") AND ("I"."ID_RISKOBJECT" = "C"."ID_RISKOBJECT"))) AS "C1" 
    FROM (SELECT 
     "D"."A1" AS "C1", 
     "D"."K1" AS "ID_RISKOBJECT" 
     FROM (SELECT 
       "F"."ID_RISKOBJECT" AS "K1", 
       MAX("F"."F_CREATEDON") AS "A1" 
       FROM "RISK_T_ASSESS_HIST" AS "F" 
       WHERE (("F"."ID_RISKOBJECT" IS NOT NULL) AND ("F"."F_CREATEDON" >= @p__linq__0)) AND ("F"."F_CREATEDON" <= @p__linq__1) 
       GROUP BY "F"."ID_RISKOBJECT" 
     ) AS "D" 
    ) AS "C"  
) AS "B" 
     WHERE (0 = "B"."C1") OR (1 = "B"."C1") 

क्वेरी MSSQL इंजन के लिए उत्पन्न

(हम अपने एपीपी में दो डाटाबेस इंजन का समर्थन करता है)
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 [dbo].[RISK_T_ASSESS_HIST] AS [Extent1] 
     WHERE ([Extent1].[ID_RISKOBJECT] IS NOT NULL) AND ([Extent1].[F_CREATEDON] >= @p__linq__0) AND ([Extent1].[F_CREATEDON] <= @p__linq__1) 
     GROUP BY [Extent1].[ID_RISKOBJECT] 
    ) AS [GroupBy1]) AS [Project1] 
OUTER APPLY (SELECT TOP (1) 
    [Extent2].[F_STATUS] AS [F_STATUS] 
    FROM [dbo].[RISK_T_ASSESS_HIST] AS [Extent2] 
    WHERE ([Extent2].[ID_RISKOBJECT] IS NOT NULL) AND ([Extent2].[F_CREATEDON] >=  @p__linq__0) AND ([Extent2].[F_CREATEDON] <= @p__linq__1) 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 [Limit1].[F_STATUS] IN (0,1)  
+0

क्या दृष्टिकोण आप एफई के लिए उपयोग कर रहे हैं? कोड पहले या डेटाबेस पहले? अर्थात। क्या आप डीबीकॉन्टेक्स्ट और डीबीसेट से प्राप्त करते हैं या आपके पास .edmx xml फ़ाइलें हैं? –

+0

डेटाबेस पहले, देवी विरासत के मुद्दों, हमारे पास edmx है। यदि उन्हें आवश्यकता हो तो मैं उन्हें प्रदान कर सकता हूं। – Lightning3

+0

हम mssql का भी समर्थन करते हैं, मैं कुछ परीक्षण करूँगा, और मैं – Lightning3

उत्तर

1

क्या आप SQL सर्वर के विरुद्ध विकास कर रहे हैं?

यदि आप .edmx का उपयोग कर रहे हैं तो ProviderManifestToken विशेषता (आमतौर पर एक्सएमएल की पहली 10 पंक्तियों में) एसक्यूएल सुविधाओं के समर्थित सेट को इंगित करेगी। यह डेटाबेस से मॉडल को बनाए या अद्यतन करते समय उपयोग किए गए डेटाबेस से निर्धारित किया जाता है। जैसे एक सामान्य मुद्दा SQL 2008 स्थानीय डेटाबेस के विरुद्ध काम कर रहा है और उसके बाद 2005 डेटाबेस को धक्का दे रहा है और पता लगा रहा है कि एप्लिकेशन क्रैश हो गया है क्योंकि यह SQL 2005 में डेटाटाइम 2 का समर्थन नहीं करता है। इस उदाहरण में ठीक है 2008 से ऑटो-निर्मित मान को बदलना 2005

मैं फायरबर्ड के खिलाफ काम करने से परिचित नहीं हूं लेकिन इस क्षेत्र में देखने का सुझाव देता हूं।

+0

जांचूंगा, हमारे पास यह समस्या थी :) जैसा कि आपने कहा था, mssql में हमने इसे ठीक किया है, और वर्तमान में: ProviderManifestToken = "2008" ठीक काम करता है। – Lightning3

+0

मैं पूरी लाइन को फायरबर्ड से पेस्ट कर दूंगा: <स्कीमा नेमस्पेस = "जोखिम एंटिटी मॉडेल.स्टोर" एलियास = "सेल्फ" प्रदाता = "फायरबर्ड एसक्यूएल.डाटा.फिरबर्ड क्लाइंट" प्रदाता मैनेजमेंट टोकन = "2.5" एक्सएमएलएनएस: स्टोर = "http://schemas.microsoft। com/ado/2007/12/edm/EntityStoreSchemaGenerator "xmlns =" ​​http://schemas.microsoft.com/ado/2009/02/edm/ssdl "> – Lightning3

+0

MSSQL पर सबकुछ ठीक काम करता है, समस्या फ़ायरबर्ड के लिए विशिष्ट है :( – Lightning3

1

समस्या नेट फ्रेमवर्क 4.5 और firebirdsql.data.firebirdclient.dll के बीच है - जब एसबी ने फ्रेमवर्क के इस संस्करण को स्थापित किया है - EntityFramework फ़ायरबर्ड के लिए बाहरी लागू कथन उत्पन्न करता है।

शायद जिरी Cincura (cincura.net) यह जांच करनी चाहिए :)

समस्या पूर्ण 4.0 .नेट फ्रेमवर्क पदावनति द्वारा हल

संबंधित मुद्दे