2008-10-28 25 views
72

Linq kullanarak bir sözlük (önbellekleme için) kullanarak SQL (2008) 'den iki sütunu düzgün şekilde nasıl dönüştürebilirim?Linq-to-SQL ToDictionary()

Şu anda IQueryable üzerinden geçiyorum b/c Çalışmak için ToDictionary yöntemini alamıyorum. Herhangi bir fikir? ' dan dönüştürülemez: Gerçekten yapmak istiyorum ne

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); 
} 

çalışmak görünmüyor böyle bir şey olduğunu: Bu işleri

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

Ama bu hatayı alıyorum System.Linq.IQueryable

cevap

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

Üzgünüz, daha önce hiç denemedim olabilir, ama bu bir Sözlük değil, Dictionary Codewerks

+0

= "kvp => kvp.Value" dizesini oluşturur. '. Cevabın noktası '.Enumerable()' idi. – yfeldblum

+0

Teşekkürler, evet AsEnumerable'ın gerekli olduğunu düşündüm, ancak ToDictionary çağrısı hala çalışmıyor. Her iki sütun da SQL'de varcharlardır, bu yüzden dizeler olarak geri gelirler, ama bir Dic'e nasıl ulaşacağımı anlayamıyorum .... – Codewerks

13

tek anahtar tanımlıyorsanız, ama aynı zamanda değerini dahil gerekir 'System.Collections.Generic.IEnumerable' için':

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

Bunu daha önce de denedim, ancak bu bir derleme hatası atar, "İsim" p "mevcut değil" – Codewerks

+0

diye düşündüm, yardımınız için teşekkürler! – Codewerks

+0

Rica ederim :-) – CMS

9

teşekkürler çocuklar, bana bunu düzeltmek yardımcı oldu cevaplarınız olmalıdır:

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

için aradığım tek şey AsEnumerable() gereksiniminiz nedeni, LINQ to SQL'in yerel ve uzak (SQL) işlemlerini karıştırmamasıdır, bu nedenle SQL Server'da ilk bölümün çalıştırılması ve ardından sonraki son bölüm Dictionarys :) yapabilirler nesneler LINQ kullanarak yerel olarak yürütmek :) – DamienG

+0

Anlamlıdır. Ayrıca, ToDictionary'daki ikinci parametrenin daha önce beni tetikleyen kendi Func argümanlarına ihtiyacı vardır. – Codewerks

1

Neden sadece dönüştürmek için tablodaki her öğe için anonim nesne yaratacak?

Sadece gibi bir şey kullanabilirsiniz: Sen Tablo ve ToDictionary arasında bir AsEnumerable() çağrısının yer alması gerekebilir IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); (). Tam olarak db.Table türünü bilmiyorum.


Ayrıca, ilk örneği de düzeltin, ikinci döngü değişkeniniz bildirim ve kullanımda uyumsuz.

+2

'ToDictionary' bellekte olduğundan. Anonim bir nesne oluşturmamak, yalnızca ihtiyacınız olanların yerine tüm sütunların veritabanından alındığı anlamına gelir. – Stijn

+0

'ToDictionary' temel yapıyı bilmez, yalnızca anahtar ve değer için iki geri çağrıyı çağırır (bu durumda basit özellik lambdaları seçer), böylece bu“ ToDictionary ”çağrısı örnekte foreach'a işlevsel olarak eşdeğer olmalıdır. sağlanan. Bildiğim kadarıyla, tüm LINQ yöntemleri ertelenir, yani geri aramalar sadece gerektiğinde çağrılır. – TWiStErRob

+3

SQL Server Profiler ile bakarsanız, anonim bir nesne ile yalnızca iki sütunun seçildiğini ve bunların olmadan tüm sütunların seçildiğini görürsünüz. – Stijn

İlgili konular