लाइनक-टू-एसक्यूएल टौडर ()


81

मैं SQL (2008) से Linq को एक शब्दकोश (कैशिंग के लिए) में उपयोग करते हुए दो कॉलमों को ठीक से कैसे बदलूँ?

मैं वर्तमान में IQueryable b / c के माध्यम से लूप कर रहा हूं, मुझे काम करने के लिए टोबर्ड विधि नहीं मिल सकती है। कोई विचार? यह काम:

var query = from p in db.Table
            select p;

Dictionary<string, string> dic = new Dictionary<string, string>();

foreach (var p in query)
{
    dic.Add(sub.Key, sub.Value);
}

मैं वास्तव में ऐसा करना चाहूंगा जो कुछ ऐसा है, जो काम नहीं करता है:

var dic = (from p in db.Table
             select new {p.Key, p.Value })
            .ToDictionary<string, string>(p => p.Key);

लेकिन मुझे यह त्रुटि मिलती है: 'System.Linq.IQueryable' से 'System.Collections.Generic.IEnumerable' में परिवर्तित नहीं किया जा सकता

जवाबों:


121
var dictionary = db
    .Table
    .Select(p => new { p.Key, p.Value })
    .AsEnumerable()
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
;

क्षमा करें, मैं स्पष्ट नहीं हो सकता है, मैंने पहले भी कोशिश की है, लेकिन यह एक शब्दकोश बनाता है <string, #Anonymous टाइप>, डिक्शनरी नहीं <<string, string>
Codewerks

कोशिश करो kvp => kvp.Value as string। जवाब की बात यह थी .AsEnumerable()
yfeldblum

धन्यवाद, हाँ मुझे लगा कि असेंबल की जरूरत थी, लेकिन टॉडबॉय कॉल अभी भी काम नहीं करता है। दोनों कॉलम SQL में varchars हैं, इसलिए वे स्ट्रिंग्स के रूप में वापस आ जाते हैं, लेकिन मैं यह पता नहीं लगा सकता कि इसे एक डिक में कैसे प्राप्त किया जाए ....
कोडवर्ड

मुझे नहीं पता कि यह अभी भी प्रासंगिक है, लेकिन इसकी AsEnumerableआवश्यकता क्यों है ? मेरे लिए यह उसके बिना भी काम करता है, लेकिन शायद
लिनक

1
@AlexanderDerck - उस समय, AsEnumerableआवश्यक था। मुझे ठीक से याद नहीं है कि इस समय के बाद, लेकिन एक संभावित स्पष्टीकरण यह है कि ToDictionaryएक विस्तार विधि थी IEnumerable, लेकिन लिनक-टू-एसक्यूएल के लिए इंटरफ़ेस नहीं था IEnumerable
yfeldblum

16

आप केवल कुंजी को परिभाषित कर रहे हैं, लेकिन आपको मूल्य भी शामिल करने की आवश्यकता है:

var dic = (from p in db.Table
             select new {p.Key, p.Value })
            .ToDictionary(p => p.Key, p=> p.Value);

3
-1 त्रुटि यह है कि यह <string, string>हिस्सा public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);अधिभार के बजाय अधिभार का उपयोग करता है public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
user247702

मैं यह अभी भी आवश्यकता है .AsEnumerable()इससे पहले कि.ToDictionary()
ACEMARK

पूरी तरह से काम किया ... आखिरकार मैं तलाश रहा था
ब्रायन

9

धन्यवाद दोस्तों, आपके जवाबों ने मुझे इसे ठीक करने में मदद की, यह होना चाहिए:

var dic = db
        .Table
        .Select(p => new { p.Key, p.Value })
        .AsEnumerable()
        .ToDictionary(k=> k.Key, v => v.Value);

5
आपके द्वारा AsEnumerable () की आवश्यकता का कारण यह है कि LINQ से SQL स्थानीय और दूरस्थ (SQL) प्रसंस्करण को नहीं मिलाता है, इसलिए इसका पहला भाग SQL सर्वर पर निष्पादित होता है और फिर अंतिम बाद के भाग को LINQ का उपयोग करके उन वस्तुओं के लिए स्थानीय रूप से निष्पादित करता है जो कर सकते हैं शब्दकोश करें :)
डेमियन जी

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

1

आप इसे परिवर्तित करने के लिए तालिका में प्रत्येक आइटम के लिए एक अनाम ऑब्जेक्ट क्यों बनाएंगे?

आप बस कुछ इस तरह का उपयोग कर सकते हैं: IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); आपको टेबल और टोडरमल () के बीच एक असेंबल () कॉल शामिल करने की आवश्यकता हो सकती है। मैं db.Table का सटीक प्रकार नहीं जानता।


पहले नमूने को भी सही करें, आपका दूसरा लूप वेरिएबल डिक्लेरेशन और उपयोग पर बेमेल है।


2
क्योंकि ToDictionaryस्मृति में है। अनाम ऑब्जेक्ट नहीं बनाने का मतलब है कि सभी कॉलम डेटाबेस से पुनर्प्राप्त किए जाते हैं, बजाय केवल आपकी ज़रूरत के।
user247702

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

3
यदि आप SQL सर्वर प्रोफाइलर के साथ देखते हैं, तो आप देखेंगे कि एक अनाम ऑब्जेक्ट के साथ केवल दो कॉलम चुने गए हैं, और इसके बिना सभी कॉलम चुने गए हैं।
13:24 बजे user247702
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.