2009-05-22 10 views
16

यहाँ मुद्दा है:अनुकरण क्रॉस संदर्भ में शामिल - LINQ/सी #

2 डेटा संदर्भों है कि मैं एक के आधार पर संयोजन करना चाहते हैं की है। अब मुझे पता है कि LINQ एक संदर्भ से दूसरे संदर्भ में शामिल होने की इजाजत नहीं देता है, और मुझे पता है कि 2 संभावित समाधान या तो एक डेटाैकेंटेक्स्ट बनाने या 2 अलग-अलग प्रश्न पूछने के लिए होंगे (जो मैं अभी के लिए कर रहा हूं)। हालांकि मैं जो करना चाहता हूं वह है "अनुकरण" करना।

यहां मैंने जो कोशिश की है।

using (var _baseDataContext = Instance) 
{ 
    var query = from a in _baseDataContext.Account.ACCOUNTs 
       where a.STR_ACCOUNT_NUMBER.ToString() == accountID 
       join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals 
          app.GUID_ACCOUNT 
       join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION 
       select l.GUID_LOAN; 

    return query.Count() > 0 ? query.First() : Guid.Empty; 
} 

private static IQueryable<LOAN> GetLoans() 
{ 
    using (var _baseDataContext = Instance) 
    { 
     return (from l in _baseDataContext.Loan.LOANs 
       select l).AsQueryable(); 
    } 
} 

रन टाइम मैं में

System.InvalidOperationException है:

कार्य समाधान::

using (var _baseDataContext = Instance) 
{ 
    var query = from a in _baseDataContext.Account.ACCOUNTs 
       where a.STR_ACCOUNT_NUMBER.ToString() == accountID 
       join app in _baseDataContext.Account.APPLICATIONs on a.GUID_ACCOUNT_ID equals 
          app.GUID_ACCOUNT 
       join l in GetLoans() on app.GUID_APPLICATION equals l.GUID_APPLICATION 
       select l.GUID_LOAN; 

    return (query.Count() > 0) ? query.First() : Guid.Empty; 
} 

private static IEnumerable<LOAN> GetLoans() 
{ 
    using (var _baseDataContext = Instance) 
    { 
     return (from l in _baseDataContext.Loan.LOANs 
       select l).AsQueryable(); 
    } 
} 
क्वेरी एक अलग डेटा संदर्भ

संपादित करें पर परिभाषित आइटम के संदर्भ हैं

उत्तर

12

शायद ऐसा कुछ आपको सही दिशा में शुरू कर सकता है। मैंने आपके कॉलम नामों के आधार पर समान कॉलम के साथ एक नकली डेटाबेस बनाया और कुछ परिणाम प्राप्त किए।

class Program 
{ 
    static AccountContextDataContext aContext = new AccountContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); 
    static LoanContextDataContext lContext = new LoanContextDataContext(@"Data Source=;Initial Catalog=;Integrated Security=True"); 

    static void Main() 
    { 

     var query = from a in aContext.ACCOUNTs 
        join app in aContext.APPLICATIONs on a.GUID_ACCOUNT_ID equals app.GUID_ACCOUNT 
        where app.GUID_APPLICATION.ToString() == "24551D72-D4C2-428B-84BA-5837A25D8CF6" 
        select GetLoans(app.GUID_APPLICATION); 

     IEnumerable<LOAN> loan = query.First(); 
     foreach (LOAN enumerable in loan) 
     { 
      Console.WriteLine(enumerable.GUID_LOAN); 
     } 

     Console.ReadLine(); 
    } 

    private static IEnumerable<LOAN> GetLoans(Guid applicationGuid) 
    { 
     return (from l in lContext.LOANs where l.GUID_APPLICATION == applicationGuid select l).AsQueryable(); 
    } 
} 

आशा इस मदद करता है!

+0

मैंने पहले आईन्यूमेरेबल लौटने की कोशिश की लेकिन अपेक्षित के रूप में एक कास्टिंग त्रुटि प्राप्त की। हालांकि मैंने एक IENuerable AsQueryable लौटने का विचार नहीं किया था। –

+0

इस दृष्टिकोण के साथ एक संभावित समस्या यह है कि आप शुद्ध जुड़ाव नहीं कर रहे हैं, इसलिए यदि आपको ऋण संदर्भ में एक और शामिल करने की आवश्यकता है तो आप जो भी देख सकते हैं उससे सक्षम नहीं होंगे। –

+0

ठीक है इसे बाहर काम किया। हम विधि में शामिल होने वाले खंड को हटा सकते हैं और विधि से चयन करने के बजाय बस एक शुद्ध जुड़ाव कर सकते हैं।यहां की चाल यह है कि विधि को एक आईनेमरेबल वापस करना होगा .अनुक्रम योग्य यह हमें क्रॉस संदर्भ में शामिल होने की अनुमति देता है, और इस प्रकार तक मुझे कोई प्रदर्शन हिट नहीं दिखाई दे रही है। –

0

मैं एक अलग डेटा संदर्भ बनाने का पक्ष करता हूं जो contai ns केवल दो टेबल जो आप शामिल होना चाहते हैं। लेकिन मुझे लगता है कि आप दूसरे संदर्भ में एक अस्थायी तालिका (पहले संदर्भ से डेटा युक्त) बनाए रख सकते हैं, और फिर अस्थायी तालिका में शामिल हो सकते हैं।

+0

एक पृथक डेटाकॉन्टेक्स्ट बनाने जहां केवल दो तालिकाओं की आवश्यकता है, एक संभावना है, हालांकि यह एक अलग आवश्यकता नहीं है, यह इस समाधान की आवश्यकता का केवल एक उदाहरण है। जब भी मुझे इस ज़रूरत को पूरा करने की ज़रूरत है, मैं हर समय एक अलग डेटाकॉन्टेक्स्ट बनाने से बचना चाहता हूं। –

3

यह "के आसपास काम" है कि हम मिल गया है ...

हम बाहर मैन्युअल रूप से अन्य डेटाबेस से हमारे टेबल बनाया गया है और अगर यह तो एक ही सर्वर पर है हम साथ तालिका नाम पहले से जुड़ा हुआ है:

<DatabaseName>.<SchemaName>.<YourTableName> 

अगर वे किसी लिंक किए गए सर्वर पर हैं तो आप सर्वर नाम अवश्य लगा दें करने के लिए भी है:

<ServerName>.<DatabaseName>.<SchemaName>.<YourTableName> 

यह आपको मिलती है और अभी भी एक गैर निष्पादित मैं वापस जाने के लिए अनुमति देगा प्रश्नोत्तरी ... जो हम चाहते थे। इन 2 मेमोरी इन-मेमोरीबल्स में शामिल होने में शामिल होने का दूसरा तरीका है जिसका मतलब है कि आप शामिल होने से पहले प्रत्येक के लिए सभी रिकॉर्ड्स खींचते हैं (उपरोक्त) और एक IQueryable एक ऐसी विधि का उपयोग करके शामिल होते हैं जिसमें सीमाएं हैं ...

उम्मीद है कि भविष्य में DataContext को यह जानने के लिए पर्याप्त स्मार्ट बनाया जाएगा कि यदि सर्वर जुड़े हुए हैं तो आप दो अलग-अलग लोगों के बीच जुड़ सकते हैं।

+0

हालांकि यह एक अच्छा विचार है हालांकि इस मामले में यह एक विकल्प नहीं है। हालांकि सुझाव के लिए धन्यवाद। –

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