कनवर्ट करें Linq क्वेरी परिणाम शब्दकोश


346

मैं कुछ पंक्तियों को Linq से SQL का उपयोग कर डेटाबेस में जोड़ना चाहता हूं, लेकिन मैं पंक्तियों को जोड़ने से पहले एक "कस्टम चेक" बनाना चाहता हूं कि क्या मुझे इनकमिंग पंक्तियों को जोड़ना, बदलना या अनदेखा करना है। मैं क्लाइंट और DB सर्वर के बीच ट्रैफ़िक को कम से कम रखना चाहता हूं और प्रश्नों की संख्या कम से कम करना चाहता हूं।

ऐसा करने के लिए, मुझे सत्यापन के लिए आवश्यक रूप से कम जानकारी प्राप्त करनी है, और प्रक्रिया की शुरुआत में केवल एक बार।

मैं ऐसा कुछ करने की सोच रहा था, लेकिन जाहिर है, यह काम नहीं करता है। किसी को एक विचार है?

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj
        select (new KeyValuePair<int, DateTime>(ot.Key, ot.TimeStamp))
    )

टेबलऑबजेक्ट से पूरे ऑब्जेक्ट टाइप को डाउनलोड किए बिना, मैं अंत में एक शब्दकोश होना चाहूंगा।

मैंने निम्नलिखित कोड पर भी विचार किया, लेकिन मैं एक उचित तरीका खोजने की कोशिश कर रहा था:

List<int> keys = (from ObjType ot in TableObj orderby ot.Key select ot.Key).ToList<int>();
List<DateTime> values = (from ObjType ot in TableObj orderby ot.Key select ot.Value).ToList<int>();
Dictionary<int, DateTime> existingItems = new Dictionary<int, DateTime>(keys.Count);
for (int i = 0; i < keys.Count; i++)
{
    existingItems.Add(keys[i], values[i]);
}

जवाबों:


633

इसToDictionary तरह से विधि का उपयोग करने की कोशिश करें:

var dict = TableObj.ToDictionary( t => t.Key, t => t.TimeStamp );

2
@pawan, यह एन्यूमरेशन में प्रत्येक तत्व के लिए एक प्लेसहोल्डर है और एन्यूमरेशन में ऑब्जेक्ट्स के प्रकार को लेता है।
tvanfosson

1
@pawan - यह सही नहीं लगता। मुझे उम्मीद है कि var servers = list.Select( s => new { s.ProjectName, Url = "tcp://" + s.BuildMachineName + ":" + s.PortNumber + "/CruiseManager.rem" } ).ToDictionary( s => s.ProjectName, s.Url ); यह प्रोजेक्ट नाम / url जोड़े के प्रोजेक्ट नाम से बना एक शब्दकोश है।
tvanfosson

3
.Select( t => new { t.Key, t.TimeStamp } )अभिव्यक्ति क्यों आवश्यक है?
बेन कॉलिन्स

9
@BenCollins: मुझे लगता है कि मध्यवर्ती .Selectप्रत्येक स्तंभ का चयन करने के बजाय केवल और केवल कुंजी और टाइमस्टैम्प का चयन करने के लिए उत्पन्न SQL का कारण बनता है।
जोए एडम्स

1
आप इस मध्यस्थ को छोड़ सकते हैं Selectयदि आप
लाइनक

119

आपके उदाहरण को देखते हुए, मुझे लगता है कि आप यही चाहते हैं:

var dict = TableObj.ToDictionary(t => t.Key, t=> t.TimeStamp);

वाह ... यह उस तरह से सरल हो सकता है ... चूंकि मैं प्रोग्रामिंग के लिए बहुत नया हूं, इसलिए मैं कोशिश करूंगा और यह सुनिश्चित करने के लिए थोड़ा प्रोफाइलिंग करूंगा कि हुड के नीचे, मुझे पूरे ऑब्जेक्ट का हिट न मिले। मैं तुम्हें तैनात रखेंगे।
टीप्क्स

1
मैंने सिर्फ अपना चेक बनाया। अफसोस की बात है, जबकि TableObj प्राप्त करते समय, यह db से सभी ऑब्जेक्ट्स को प्राप्त करता है, इसलिए मैं अंत में ट्रैफ़िक हिट प्राप्त कर रहा हूं। मैंने उन प्रश्नों को भी जांचा जो मैंने दूसरे तरीके से पोस्ट किए थे (और बचना चाहते थे) और उन्हें केवल आवश्यक आइटम मिलते हैं। सुनिश्चित करें कि यह 2 प्रश्न करता है इसलिए सर्वर को स्वयं दो बार तालिकाओं को खोजना होगा, लेकिन ऑब्जेक्ट मैपिंग पर्याप्त सरल है।
टिपक्स

7
आप ऐसा करने में सक्षम हो सकते हैं: TableObj.Select (t => new {t.Key, t.Timeamp andamp;))। Toprise (t => t.Key, t => t.TimeStamp); LinqToSql को यह नोटिस करने में सक्षम होना चाहिए कि आप केवल दो चीजों (चयन से) चाहते हैं और उन्हें वापस लौटा दें। मुझे यकीन नहीं है कि यह टॉड्रिक्स () की विशिष्टताओं में खोदने के लिए पर्याप्त स्मार्ट है।
तल्जोई

1
अच्छा! यहाँ परिणामी क्वेरी है: SELECT [t0]। [Key], [t0]। [टाइमस्टैम्प] FROM [TableObj] AS [t0]। मैं इसके लिए श्रेय नहीं लेना चाहता, इसलिए आगे बढ़ें और इसे एक अन्वेषक के रूप में पोस्ट करें! :-P
टिपेक्स

8

निम्नलिखित प्रयास करें

Dictionary<int, DateTime> existingItems = 
    (from ObjType ot in TableObj).ToDictionary(x => x.Key);

या पूरी तरह से विकसित संस्करण अनुमान संस्करण

var existingItems = TableObj.ToDictionary(x => x.Key);

Awser JaredPar के लिए धन्यवाद। मैंने ऐसा कुछ के बारे में पढ़ाया था, लेकिन मुझे लगता है कि यह ओब्जेक्ट टाइप की पूरी वस्तुओं को लौटाएगा, और इवैंट को पूरी वस्तुओं को डाउनलोड करने से बचने के लिए।
1

@ Tipx, क्या आप कुछ जानकारी प्रदान कर सकते हैं जिसे आप फ़िल्टर करना चाहते हैं? एक फिल्टर क्लॉज जोड़ना संभव है, लेकिन मैं आपके प्रश्न से यह नहीं बता सकता कि क्या महत्वपूर्ण है
JaredPar

सभी को मुझे यह जानना होगा कि क्या "नई पंक्ति" को जोड़ने की आवश्यकता है, अनदेखा किया जाए या किसी अन्य पंक्ति को प्रतिस्थापित किया जाए जो ऑब्जेक्ट का टाइमस्टैम्प है। डीबी की वस्तुओं में बहुत सारे क्षेत्र होते हैं जिनकी मुझे मान्यता की आवश्यकता नहीं होती है और मैं संपूर्ण वस्तुओं को प्राप्त करने के लिए प्रदर्शन हिट प्राप्त नहीं करना चाहता। इसे सरल रखने के लिए, मुझे अपने बीडी में 20 कॉलम, 100 000 पंक्तियों के साथ एक तालिका मिली और मैं पहले 2 कॉलम के मूल्यों का उपयोग करके एक शब्दकोश निकालना चाहता हूं।
टिपेक्स

मैंने बस उस कोड द्वारा उत्पन्न सर्वर प्रश्नों की जाँच की और जैसा कि आप शायद जानते थे, यह पूरी वस्तुओं को प्राप्त करता है।
टिप

0

नेमस्पेस का उपयोग करें

using System.Collections.Specialized;

DataContextकक्षा का उदाहरण बनाएं

LinqToSqlDataContext dc = new LinqToSqlDataContext();

उपयोग

OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value);

मान प्राप्त करने के लिए नेमस्पेस का उपयोग करें

   using System.Collections;

ICollection keyCollections = dict.Keys;
ICOllection valueCollections = dict.Values;

String[] myKeys = new String[dict.Count];
String[] myValues = new String[dict.Count];

keyCollections.CopyTo(myKeys,0);
valueCollections.CopyTo(myValues,0);

for(int i=0; i<dict.Count; i++)
{
Console.WriteLine("Key: " + myKeys[i] + "Value: " + myValues[i]);
}
Console.ReadKey();

के लिए multilple कुंजी ?
किकेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.