2008-12-09 5 views
35

मुझे दो टेबल मिल गए हैं जिन्हें LINQ के माध्यम से शामिल होने की आवश्यकता है, लेकिन वे विभिन्न डेटाबेस में रहते हैं। अभी मैं एक टेबल के परिणाम लौट रहा हूं, फिर दूसरे के परिणामों को लूपिंग और पुनर्प्राप्त कर रहा हूं, जैसा कि आप अनुमान लगा सकते हैं वह बहुत कुशल नहीं है। क्या उन्हें एक LINQ कथन में लाने का कोई तरीका है? क्या लूपिंग से बचने के लिए इसे बनाने का कोई और तरीका है? अगर मैं कुछ दिख रहा हूं तो मैं सिर्फ विचारों की तलाश में हूं।कई डेटाबेसों में LINQ

ध्यान दें कि मैं डेटाबेस को परिवर्तित नहीं कर सकता, यानी मैं दूसरे में संदर्भ में एक दृश्य नहीं बना सकता। मैंने अभी तक कोशिश नहीं की है जो एक तीसरे डेटाबेस में विचार बना रहा है जो दोनों तालिकाओं का संदर्भ देता है। कोई विचार स्वागत है।

+0

आप डेटाबेस क्यों नहीं बदल सकते हैं? – tuinstoel

+0

तृतीय पक्ष। डीबीए वहां वस्तुओं को बनाने से दूर रहना चाहता है, भले ही यह एक साधारण दृश्य है। – gfrizzle

उत्तर

39

आप कर सकते हैं, यहां तक ​​कि सर्वरों पर भी, जब तक आप दूसरे से एक डेटाबेस तक पहुंच सकते हैं। यही है, यदि सर्वर ए के विरुद्ध SQL कथन लिखना संभव है। डेटाबेस ए जो सर्वर बी तक पहुंचता है। डाटाबेसबीस्कीमातालिका जो भी, तो आप LINQ में भी वही काम कर सकते हैं।

ऐसा करने के लिए, आपको हाथ से .dbml फ़ाइल को संपादित करने की आवश्यकता होगी। आप इसे आसानी से वीएस 2008 में ऐसा कर सकते हैं: राइट-क्लिक करें, चुनें ..., और एक्सएमएल संपादक चुनें।

कनेक्शन तत्व देखें, जो फ़ाइल के शीर्ष पर होना चाहिए। आपको उस कनेक्शन स्ट्रिंग द्वारा इंगित डेटाबेस में नहीं तालिकाओं के लिए एक स्पष्ट डेटाबेस नाम (और सर्वर का नाम, यदि अलग है) प्रदान करना है।

अपने .dbml में एक टेबल तत्व के लिए खुलने वाला टैग इस तरह दिखता है:

<Table Name="dbo.Customers" Member="Customers"> 

आपको क्या करने की जरूरत है कनेक्शन स्ट्रिंग के डेटाबेस में किसी तालिका नहीं के लिए, है, कि बदल इनमें से किसी एक की तरह नाम कुछ करने के लिए विशेषता:

<Table Name="SomeOtherDatabase.dbo.Customers" Member="Customers"> 
<Table Name="SomeOtherServer.SomeOtherDatabase.dbo.Customers" Member="Customers"> 

आपको समस्याएं आ रही हैं, तो सुनिश्चित करें कि अन्य डेटाबेस (या सर्वर) बनाने वास्तव में आपके मूल डेटाबेस (या सर्वर) से सुलभ है।

SELECT SomeColumn 
FROM OtherServer.OtherDatabase.dbo.SomeTable 

तो कि काम नहीं करता है, सुनिश्चित करें कि आप एक उपयोगकर्ता हैं या करने के लिए उपयोग के साथ प्रवेश करते हैं: एसक्यूएल सर्वर प्रबंधन स्टूडियो में, एक छोटे से SQL विवरण अपने मूल डेटाबेस के खिलाफ चल रहा है कि कुछ इस तरह करता है लिखने का प्रयास करें एक ही पासवर्ड के साथ दोनों डेटाबेस। यह निश्चित रूप से, आपके .dbml की कनेक्शन स्ट्रिंग में उपयोग किए जाने वाले जैसा ही होना चाहिए।

+1

यदि जेनरेट की गई फ़ाइल को संशोधित करने के बारे में चिंता है, तो मैं जेनरेट (सी # या वीबी) कक्षा को मैन्युअल नियंत्रण के तहत फ़ाइल में निकालने और उस वर्ग के गुणों में परिवर्तन करने की सलाह देता हूं। –

+10

आप ओ/आर-डिजाइनर में भी स्रोत बदल सकते हैं। बस एक टेबल के गुणों को खोलें, "स्रोत" देखें, जिसमें "dbo.Customers" होगा और डेटाबेस नाम "SomeOtherDatabase.dbo.Customers" रखने के लिए बदला जा सकता है। तो यह कोई हैक नहीं है, स्रोत को बदलने के लिए यह बिल्कुल ठीक है। – Sam

+1

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

6

अपने डेटाबेस में एक प्रो/व्यू बनाएं।

0

अपनी स्थितियों को देखते हुए, मुझे नहीं लगता कि आप इसे एक लिंक कथन में कर सकते हैं। लेकिन आप ऑब्जेक्ट्स क्वेरी में लिंक से अपने एल 2 एस प्रश्नों के परिणामों में शामिल हो सकते हैं।