Konversi Hasil Kueri Linq ke Kamus


346

Saya ingin menambahkan beberapa baris ke database menggunakan Linq ke SQL, tetapi saya ingin membuat "pemeriksaan khusus" sebelum menambahkan baris untuk mengetahui apakah saya harus menambahkan, mengganti, atau mengabaikan baris incomming. Saya ingin menjaga trafik antara klien dan server DB serendah mungkin dan meminimalkan jumlah kueri.

Untuk melakukan ini, saya ingin mengambil informasi sesedikit yang diperlukan untuk validasi, dan hanya sekali pada awal proses.

Saya berpikir untuk melakukan sesuatu seperti ini, tetapi jelas, itu tidak berhasil. Adakah yang punya ide?

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

Apa yang ingin saya miliki pada akhirnya adalah Kamus, tanpa harus mengunduh seluruh objek ObjectType dari TableObject.

Saya juga mempertimbangkan kode berikut, tetapi saya berusaha menemukan cara yang tepat:

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

Jawaban:


632

Coba gunakan yang ToDictionarymetode seperti:

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

2
@pawan, ini adalah penampung untuk setiap elemen dalam enumerasi dan mengambil jenis objek dalam enumerasi.
tvanfosson

1
@pawan - itu tidak beres. Saya berharap var servers = list.Select( s => new { s.ProjectName, Url = "tcp://" + s.BuildMachineName + ":" + s.PortNumber + "/CruiseManager.rem" } ).ToDictionary( s => s.ProjectName, s.Url ); ini membuat kamus dikunci dengan nama proyek pasangan nama proyek / url.
tvanfosson

3
Mengapa .Select( t => new { t.Key, t.TimeStamp } )ungkapan itu perlu?
Ben Collins

9
@ BenCollins: Saya pikir perantara .Selectmenyebabkan SQL yang dihasilkan hanya memilih Key dan TimeStamp, daripada memilih setiap kolom.
Joey Adams

1
Anda bisa menghilangkan perantara ini Selectjika Anda melakukan Linq to Object (bukan Linq to SQL)
Pac0

119

Melihat contoh Anda, saya pikir inilah yang Anda inginkan:

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

Wow ... Mungkin sesederhana itu ... Karena saya cukup baru dalam pemrograman, saya akan mencoba dan melakukan sedikit profil untuk memastikan bahwa di bawah tenda, saya tidak mendapatkan hit dari seluruh objek. Saya akan membuat Anda diposting.
Tipx

1
Saya baru saja membuat cek saya. Sayangnya, saat mendapatkan TableObj, ia mengambil semua objek dari db jadi saya akhirnya mendapatkan hit lalu lintas. Saya juga memeriksa pertanyaan yang saya posting kedua (dan ingin menghindari) dan mereka hanya mendapatkan item yang diperlukan. Tentu itu 2 query sehingga server itu sendiri harus mencari dua kali tabel, tetapi pemetaan objek cukup sederhana.
Tipx

7
Anda mungkin dapat melakukan: TableObj.Select (t => new {t.Key, t.TimeStamp}) .DataKatalog (t => t.Key, t => t.TimeStamp); LinqToSql seharusnya dapat memperhatikan bahwa Anda hanya menginginkan dua hal (dari pilihan) dan mengembalikannya. Saya tidak yakin itu cukup pintar untuk menggali ke dalam spesifik ToDictionary ().
Talljoe

1
BAGUS! Ini adalah hasil query: SELECT [t0]. [Key], [t0]. [TimeStamp] DARI [TableObj] AS [t0]. Saya tidak ingin mengambil kredit untuk ini jadi teruskan dan posting itu sebagai anwser! :-P
Tipx

8

Coba yang berikut ini

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

Atau versi versi tipe sepenuhnya matang

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

Terima kasih untuk JaredPar anwser. Saya mengajar tentang sesuatu seperti itu, tetapi saya pikir ini akan mengembalikan seluruh objek dari tipe ObjType, dan Iwant untuk menghindari keharusan mengunduh seluruh objek.
Tipx

@ Tipx, dapatkah Anda memberikan beberapa informasi tentang apa yang ingin Anda filter? Menambahkan klausul filter mungkin, tapi aku tidak bisa mengatakan dari pertanyaan Anda apa yang penting
JaredPar

Yang perlu saya ketahui adalah apakah "baris baru" perlu ditambahkan, diabaikan atau ganti baris lain adalah cap waktu objek. Objek dalam DB memiliki banyak bidang yang tidak saya butuhkan untuk validasi dan saya tidak ingin mendapatkan performa terbaik untuk mendapatkan seluruh objek. Untuk membuatnya tetap sederhana, saya mendapat tabel di BD saya dengan 20 kolom, 100.000 baris dan saya ingin mengekstrak Kamus menggunakan nilai dari 2 kolom pertama.
Tipx

Saya baru saja memeriksa permintaan server yang dihasilkan oleh kode itu dan seperti yang mungkin Anda tahu, itu mendapatkan seluruh objek.
Tipx

0

Gunakan namespace

using System.Collections.Specialized;

Buat instance dari DataContextKelas

LinqToSqlDataContext dc = new LinqToSqlDataContext();

Menggunakan

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

Untuk mengambil nilai, gunakan 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();

Untuk tombol Multilple ?
Kiquenet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.