2009-05-12 4 views
17

क्या कोई अज्ञात प्रकार का उपयोग किए बिना linqtosql का उपयोग करके एक विशिष्ट कॉलम प्राप्त करने और अलग-अलग दायर किए गए प्रत्येक निर्दिष्ट निर्दिष्ट करने का कोई तरीका है?लिंक से एसक्यूएल - कोई विशेष कॉलम नहीं प्राप्त करें

हम SQLMetal का उपयोग dbml फ़ाइल जेनरेट करने के लिए करते हैं जिसमें क्वेरी के डेटा परिणामों को रखने के लिए सभी प्रकार शामिल होते हैं। हालांकि, जब चयन कॉलम linq क्वेरी में शामिल होते हैं, तो परिणाम dbml फ़ाइल में घोषित प्रकार के बजाय अज्ञात प्रकार में जाते हैं। मैं किसी विशेष तालिका से कॉलम के सभी को एक चुनना चाहता हूं, लेकिन फिर भी संबंधित डीबीएमएल प्रकार में परिणाम लौटाए गए हैं।

किसी भी विचार की सराहना की।

उत्तर

1

आपके इनपुट के लिए धन्यवाद। आखिरी समाधान जो मैंने तय किया है वह केवल उन स्तंभों को निर्दिष्ट करना है जिन्हें मैं वापस लाने के लिए चाहता हूं लेकिन यह लिंक प्रकार के भीतर एक प्रकार की नई वस्तु में ऐसा करने के लिए करना है ... एक उदाहरण मदद करनी चाहिए!:

टेबल लॉग तीन colums

  • LogID
  • DateLogged
  • SerializedData

लेकिन मैं केवल DateLogged & धारावाहिक डेटा चाहते हैं।


मंद q = logItem से dc.Log में चयन के लिए नई प्रवेश के साथ {.LogID =: हालांकि, मैं के भीतर एक datacontainer SQLMetal द्वारा उत्पन्न

मैं निम्न कथन से यह लक्ष्य प्राप्त इस चाहते हैं logItem.LogID, .DateLogged = logItem.DateLogged}


आशा है कि किसी और वहाँ बाहर मदद करता है!

+1

आप कर रहे हैं सही है, तो आप एक के बजाय एक "नाम" वर्ग का उपयोग कर सकते गुमनाम वर्ग, लेकिन आप अभी भी "प्रत्येक लौटा क्षेत्र अलग-अलग निर्दिष्ट करें", जिसे आपने अपने प्रश्न में कहा था कि आप नहीं करना चाहते थे: पी – Lucas

0

जिस तरह से LINQ से SQL जानता है कि कौन से कॉलम शामिल करना है, वह अज्ञात प्रकार है जिसे आप क्वेरी पर प्रोजेक्ट करते हैं। मुझे नहीं लगता कि LINQ से SQL को कॉलम को सीधे प्रक्षेपण के रूप में बाहर करने का कोई अन्य तरीका है सब कुछ वापस कर देगा।

17

LINQ से SQL lazy loading व्यक्तिगत गुणों का समर्थन करता है। डीबीएमएल डिजाइनर में, आप कॉलम के गुणों में Delay Loadedtrue पर सेट कर सकते हैं। लोड किए गए विलंब कॉलम प्रारंभिक SELECT में शामिल नहीं किए जाएंगे। यदि आप ऑब्जेक्ट की संपत्ति तक पहुंचने का प्रयास करते हैं और इसे अभी तक लोड नहीं किया गया है, तो यह मान डीबी से लाने के लिए अन्य SELECT कथन निष्पादित किया जाएगा।

यदि आप हाथ से डीबीएमएल फ़ाइल संपादित कर रहे हैं, तो <Column IsDelayLoaded="true"> सेट करें। यदि आप अपने LINQ को SQL कक्षाओं में हाथ से लिख रहे हैं, तो T के बजाय Link<T> के रूप में संपत्ति के बैकिंग फ़ील्ड को घोषित करना उतना ही आसान है। उदाहरण के लिए:

[Table] 
public class Person 
{ 
    private Link<string> _name; 

    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name.Value; } 
     set { _name.Value = value; } 
    } 
} 

भी देखें this post by Scott Guthrie में "देरी/लेज़ी लोड हो रहा है" खंड।


अद्यतन: उपर्युक्त उत्तर लागू होता है यदि आप चाहते हैं कि कॉलम अभी भी उपलब्ध हो। इसे SELECT में शामिल नहीं किया जाएगा जबतक कि आप इसे विशेष रूप से नहीं पूछते (देखें LoadOptions) या इसे एक्सेस करने का प्रयास करें।

यदि आप कॉलम का उपयोग या उपयोग नहीं करना चाहते हैं, और आप इसे कक्षा संपत्ति के रूप में उपलब्ध नहीं करना चाहते हैं, तो डीबीएमएल फ़ाइल से कॉलम को हटाने के Serapth's answer के साथ जाएं। सुनिश्चित करें कि आप उस कॉलम पर समवर्ती जांच की हानि जैसे प्रभावों को समझते हैं।

4

यदि आप बेहद आलसी हैं, तो डीबीएमएल डिज़ाइनर के माध्यम से दूसरी बार तालिका क्यों न जोड़ें, इसे MyTableWithOutColumnX का नाम दें, फिर उस रिकॉर्ड को हटा दें जिसे आप वापस नहीं करना चाहते हैं? बस कॉलम नाम को हिलाएं और हटाएं हटाएं।

इसकी मैला, लेकिन फिर, एक निश्चित डिग्री के लिए, इसलिए एक टेबल है जहां कभी-कभी रिकॉर्ड नहीं दिखना चाहिए। और कुछ भी, यह आसान है, यह सब डीबीएमएल में संक्षेप में है, इसलिए इसे किस तालिका तक पहुंचने के अलावा स्विच करने के अलावा आपके कोड को प्रभावित नहीं करना चाहिए। अच्छी तरह से नामित, यह किसी भी भविष्य में अपने कोड को बनाए रखने के लिए भी समझ में आ सकता है।

1

SQLMetal का उपयोग करके स्तंभों की आलसी लोडिंग को सक्षम करने के उदाहरण के लिए this link पर देखें।

यह मूल रूप से XSLT पोस्ट प्रक्रिया करने के लिए उत्पन्न फ़ाइल का उपयोग करता स्तंभ प्रकार (System.Data.Linq namesapce से दोनों प्रकार के) Link<X> को X से कन्वर्ट करने के लिए

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