में आंतरिक जुड़ने और बाएं शामिल होने के लिए कैसे मैं ईएफ 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 पर पर (Nullable1 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
को संशोधित किया है
और यह काम करना शुरू कर दिया। मुझे उस स्थान पर शून्य जांच तर्क को स्थानांतरित करना है जहां मैं परिणाम का उपयोग कर रहा हूं। अब, मैं सोच रहा हूं कि अपवाद का कारण क्या हो सकता है? अपवाद विवरण से, ऐसा प्रतीत होता है कि यह संदर्भ प्रकार के रूप में एम (जो एक अज्ञात प्रकार है) को नहीं समझ सकता है। क्या यह व्यवहार कहीं दस्तावेज है?
इस परिदृश्य को फिर से जांचने के लिए समय निकालने का समय मिला! – VinayC