6

में आंतरिक जुड़ने और बाएं शामिल होने के लिए कैसे मैं ईएफ 4.1 से DBContext एपीआई का उपयोग कर रहा हूं। निम्नलिखित पर विचार करें इकाई मॉडल (ए, बी, ई, डी संस्थाओं कर रहे हैं)एंटिटी फ्रेमवर्क

एक: सहायता

बी: सहायता, सीआईडी ​​

ई: ईद, सहायता

डी: ईद, सीआईडी , डाटा

क्या मैं चाहता हूँ एसक्यूएल क्वेरी के नीचे के बराबर है

SELECT 
    B.aId, 
    B.cId, 
    COALESCE(M.Data, [default value]) 
FROM 
    B LEFT OUTER JOIN 
    (
     SELECT 
     E.aId, 
     D.cId, 
     D.Data 
     FROM 
     E INNER JOIN D ON E.eId = D.eId 
    ) M 
    ON B.aId = M.aId AND B.cId = M.cId 

बी, ई & डी पर शामिल होना आसान है, लेकिन मुझे पता चला कि मैं उपरोक्त क्वेरी को हल नहीं कर सकता। मैं क्या सोचता हूँ की मैं कोशिश की है LINQ प्रपत्र एक बराबर क्वेरी

// inner join equivalent 
var ee = db.E.Join(db.D, e => e.eId, d => d.eId, 
    (e, d) => new { e.aId, e.eId, d.cId, d.Data }); 

// left outer join 
var o = from c in db.B 
     join e in ee on new { c.aId, c.cId } 
      equals new { e.aId, e.cId } into temp 
     from m in temp.DefaultIfEmpty() 
     select new 
     { 
      c.aId, 
      c.cId, 
      Data = null != m ? m.Data : [default value] 
     }; 

बहरहाल, यह विफल रहता होगा जब मैं निम्न अपवाद विवरण के साथ o.ToString() फोन:

System.ArgumentException: DbIsNullExpression को तर्क चाहिए एक आदिम या संदर्भ प्रकार का संदर्भ लें। System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateIsNull पर System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.CreateIsNullExpression पर (DbExpression तर्क, बूलियन allowRowType) (ExpressionConverter माता पिता, अभिव्यक्ति इनपुट) पर System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate (ExpressionConverter माता पिता, अभिव्यक्ति LINQ)

पर (ExpressionConverter माता पिता, BinaryExpression LINQ) ... [यहां अधिक स्टैक ट्रेस]

System.Data.Objects.ELinq.ExpressionConverter.Convert()
पर System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression (अभिव्यक्ति LINQ) System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan पर पर (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery.ToTraceString() at System.Data.Entity.Internal.Linq.InternalQuery 1.ToString() System.Data.Entity.Infrastructure.DbQuery`1.ToString()

में मैं विस्तार तरीकों का उपयोग कर समान क्वेरी बनाने के लिए कोशिश की, लेकिन एक ही अपवाद पड़ा है। मुझे यहां क्या समझ नहीं आ रहा है?

--------------------------------------------- ------------------------------------

संपादित करें:

यह प्रतीत होता है कि इस मुद्दे को लाइन की वजह से था

Data = null != m ? m.Data : [default value] 

मैं इसे

Data = m 
को संशोधित किया है

और यह काम करना शुरू कर दिया। मुझे उस स्थान पर शून्य जांच तर्क को स्थानांतरित करना है जहां मैं परिणाम का उपयोग कर रहा हूं। अब, मैं सोच रहा हूं कि अपवाद का कारण क्या हो सकता है? अपवाद विवरण से, ऐसा प्रतीत होता है कि यह संदर्भ प्रकार के रूप में एम (जो एक अज्ञात प्रकार है) को नहीं समझ सकता है। क्या यह व्यवहार कहीं दस्तावेज है?

उत्तर

2

ठीक है आप एक जुड़ी इकाई की जांच कर रहे थे, जो एसक्यूएल के मामले में समझ में नहीं आता है। निम्नलिखित को कोलेसे के रूप में ठीक से व्याख्या किया जाना चाहिए:

Data = m.Data ?? [default value] 
+0

इस परिदृश्य को फिर से जांचने के लिए समय निकालने का समय मिला! – VinayC

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