2009-06-05 13 views
248

Sözlüğe dönüştürme, ama ben, yer değiştirmesi veya incomming satırları görmezden gerekiyorsa bilmek satır eklemeden önce bir "özel onay" yapmak istiyorum . İstemciyle DB sunucusu arasındaki trafiği olabildiğince alçak tutmak ve sorgu sayısını azaltmak istiyorum. Linq Sorgu sonucu ben SQL Linq to kullanarak bir veritabanına bazı satırları eklemek istediğiniz

Ben sürecin başında sadece bir kez doğrulama için gereklidir ve olduğunca az bilgi getirmesini istediğiniz Bunu yapmak için.

Böyle bir şey yapmanın düşünüyordum ama belli çalışmıyor. Bir fikri olan var mı? Ben TableObject kadar tüm NesneTürü nesneleri indirmek zorunda kalmadan, bir sözlük olurdu sonunda almak istiyorum ne

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

.

Ben de aşağıdaki kodu düşündüm, ama uygun bir yol bulmaya çalışıyordu:

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

cevap

467

şöyle the ToDictionary method kullanarak deneyin:

var dict = TableObj.Select(t => new { t.Key, t.TimeStamp }) 
        .ToDictionary(t => t.Key, t => t.TimeStamp); 
+1

Burada ne var ??? – PawanS

+1

@pawan, numaralandırmadaki her öğe için bir yer tutucudur ve numaralandırmadaki nesnelerin türünü alır. – tvanfosson

+0

@ tvanfosson bunu bana açıklayabilir misiniz? Anlayamıyorum. Şimdi benim isteğim bir Linq'u Sözlüğe Dönüştürmektir. Sorun, Değer bir String'dir (LINQ içinde oluşturma) ve anahtar p "" "var serverUrl = (p listesinden [i] .ProjectName select {(" tcp: // "+ list [i] .BuildMachineName +" : "+ liste [i] .PortNumber +" /CruiseManager.rem ", p)}" "" – PawanS

7

aşağıdaki

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

Ya tam teşekküllü tip çıkarsanan sürümünü deneyin

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

Teşekkür kullanırlar. Böyle bir şey hakkında ders verdim, ama bunun ObjType türünün tüm nesnelerini döndüreceğini düşünüyorum ve tüm nesneleri indirmekten kaçınmak istiyorum. – Tipx

+0

@Tipx, filtrelemek istediğiniz şeyler hakkında bilgi verebilir misiniz? Bir filtre cümlesi eklemek mümkündür, ancak sorunun ne olduğunu anlayamıyorum. – JaredPar

+0

"Yeni satırın" eklenmesi, yok sayılması veya başka bir satırın yerini alması gerekip gerekmediğini bilmek zorundayım. DB'deki nesneler, doğrulama için ihtiyaç duymadığım pek çok alana sahipler ve tüm nesneleri almanın performans isabetini almak istemiyorum. Basit tutmak için , ben 20 sütununa, 100 000 satırlarla benim BD bir tablo var ve ilk 2 sütun değerleri kullanarak bir Sözlüğü ayıklamak isterdim. – Tipx

96

sizin örnek baktığımızda, bu ne istediğini düşünüyorum:

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

Vay ... Bu kadar basit olabilir ...Programlama konusunda oldukça yeni olduğum için, bunu deneyeceğim ve kaputun altında olduğundan emin olmak için küçük bir profil yapıyorum, tüm nesnenin isabetini alamıyorum. Seni haberdar ederim. – Tipx

+0

Sadece çekimi yaptım. Ne yazık ki, TableObj'yi alırken, db'den tüm nesneleri alır, böylece trafik kazası elde ederim. Ayrıca, gönderdiğim ikinci yolun (ve kaçınmak istediği) sorgularını da kontrol ettim ve yalnızca gerekli öğeleri aldılar. Sunucu iki kez tabloları aramak zorunda olduğundan 2 sorgu yapar, ancak nesne eşlemesi yeterince basittir. – Tipx

+6

Yapabilecekleriniz: TableObj.Select (t => new {t.Key, t.TimeStamp}) ToDictionary (t => t.Key, t => t.TimeStamp); LinqToSql, sadece iki şey (seçimden) istediğini ve geri getirdiğini fark edebilmelidir. ToDictionary() öğesinin ayrıntılarını incelemek için yeterince akıllı olduğundan emin değilim. – Talljoe

0

Kullanım ad

using System.Collections.Specialized; 

olun örneği Sınıf DataContext ait

LinqToSqlDataContext dc = new LinqToSqlDataContext(); 

Kullanım

01 değerleri almak için

OrderedDictionary dict = dc.TableName.ToDictionary(d => d.key, d => d.value); 
anwser JaredPar için namespace

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