Linq Sorgu Sonucunu Sözlüğe Dönüştür


346

Ben Linq to SQL kullanarak bir veritabanına bazı satırlar eklemek istiyorum, ama ben gelen satırları eklemek, değiştirmek veya yoksaymak gerekir bilmek satırları eklemeden önce bir "özel kontrol" yapmak istiyorum. İstemci ile DB sunucusu arasındaki trafiği olabildiğince düşük tutmak ve sorgu sayısını en aza indirmek istiyorum.

Bunu yapmak için, doğrulama için gerektiği kadar az bilgi almak ve sürecin başında sadece bir kez almak istiyorum.

Böyle bir şey yapmayı düşünüyordum, ama belli ki işe yaramıyor. Kimsenin bir fikri var mı?

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

Sonunda ne istiyorum TableObject tüm ObjectType nesneleri indirmek zorunda kalmadan bir Sözlük olurdu.

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

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

Yanıtlar:


633

Kullanmayı deneyin yöntemi şöyle:ToDictionary

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

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

1
@pawan - bu doğru görünmüyor. Ben beklediğiniz var servers = list.Select( s => new { s.ProjectName, Url = "tcp://" + s.BuildMachineName + ":" + s.PortNumber + "/CruiseManager.rem" } ).ToDictionary( s => s.ProjectName, s.Url ); Bu proje adı / url çiftlerinin proje adı anahtarlı bir sözlük oluşturur.
tvanfosson

3
.Select( t => new { t.Key, t.TimeStamp } )İfade neden gereklidir?
Ben Collins

9
@BenCollins: Ara .Selectüretilen SQL her anahtar seçmek yerine, yalnızca Key ve TimeStamp seçmek neden olur düşünüyorum .
Joey Adams

1
SelectLinq to Object (Linq to SQL yerine) yapıyorsanız bu aracı atlayabilirsiniz
Pac0

119

Örneğinize baktığımızda, istediğin bu olduğunu düşünüyorum:

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

Vay be ... Bu kadar basit olabilir ... Programlamaya yeni geldiğim için bunu deneyeceğim ve kaputun altında tüm nesnenin isabetini almadığından emin olmak için biraz profilleme yapacağım. Seni haberdar edeceğim.
Tipx

1
Çekimi yeni yaptým. Ne yazık ki, TableObj alırken, db tüm nesneleri alır böylece trafik isabet almak sonunda. Ayrıca ben gönderdi (ve kaçınmak istedim) ikinci yolu sorguları kontrol ve sadece gerekli öğeleri almak. Tabii 2 sorgu yapar böylece sunucunun kendisi tabloların iki kez aramak zorunda, ancak nesne eşleme yeterince basit.
Tipx

7
Şunları yapabilirsiniz: TableObj.Select (t => yeni {t.Key, t.TimeStamp}). ToDictionary (t => t.Key, t => t.TimeStamp); LinqToSql (seçimden) sadece iki şey istediğinizi fark edebilmeli ve geri verebilmelidir. Ben ToDictionary () özelliklerini kazmak için yeterince akıllı emin değilim.
Talljoe

1
GÜZEL! Ortaya çıkan sorgu şöyledir: SELECT [t0]. [Anahtar], [t0]. [TimeStamp] FROM [TableObj] AS [t0]. Bunun için kredi almak istemiyorum, bu yüzden devam edin ve bir anwser olarak gönderin! :-P
Tipx

8

Takip etmeyi dene

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

Veya tam teşekküllü tip çıkarım versiyonu

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

Cevapsız JaredPar için teşekkürler. Ben böyle bir şey hakkında öğretti, ama bu ObjType türü tüm nesneleri dönecekti düşünüyorum ve Iwant tüm nesneleri indirmek zorunda kalmamak için.
Tipx

@Tipx, nelere filtre uygulamak istediğiniz hakkında bilgi verebilir misiniz? Bir filtre cümlesi eklemek mümkündür, ancak sorunuzdan neyin önemli olduğunu söyleyemem
JaredPar

Tüm "yeni satır" eklenmesi, yok sayılması veya başka bir satır yerine bilmek nesnenin zaman damgası olduğunu bilmek gerekir. Veritabanındaki nesnelerin doğrulama için ihtiyacım olmayan birçok alanı var ve tüm nesneleri elde etme performansını elde etmek istemiyorum. Basit tutmak için, BD'de 20 sütun, 100 000 satır içeren bir tablo var ve ilk 2 sütunun değerlerini kullanarak bir Sözlük çıkarmak istiyorum.
Tipx

Ben sadece bu kod tarafından oluşturulan sunucu sorguları kontrol ve muhtemelen bildiğiniz gibi, tüm nesneleri alır.
Tipx

0

Ad alanını kullan

using System.Collections.Specialized;

DataContextSınıf örneğini oluşturma

LinqToSqlDataContext dc = new LinqToSqlDataContext();

kullanım

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

Değerleri almak için ad alanını kullanın

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

For Multilple tuşları ?
Kiquenet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.