it-swarm-id.com

Kode linq untuk memilih satu item

Saya menemukan diri saya menulis banyak kode seperti ini untuk memilih satu item yang cocok

var item = (from x in Items where x.Id == 123 select x).First();

Apakah ada cara yang lebih bersih untuk melakukannya atau ini sepadat yang akan saya dapatkan?

EDIT: Seharusnya mengatakan "Cara bersih menggunakan sintaks linq". Saya sudah mengetahui sintaks lambda dan mulai terlihat seperti ini sebenarnya satu-satunya cara. Saya memang mendapatkan beberapa info berguna, jadi terima kasih kepada semua orang yang menjawab.

97
Mikey Hogarth

Tergantung seberapa besar Anda menyukai sintaks query linq, Anda dapat menggunakan metode ekstensi secara langsung seperti:

var item = Items.First(i => i.Id == 123);

Dan jika Anda tidak ingin membuat kesalahan jika daftar kosong, gunakan FirstOrDefault yang mengembalikan nilai default untuk tipe elemen (null untuk tipe referensi):

var item = Items.FirstOrDefault(i => i.Id == 123);

if (item != null)
{
    // found it
}

Single() dan SingleOrDefault() juga dapat digunakan, tetapi jika Anda membaca dari database atau sesuatu yang sudah menjamin keunikan, saya tidak akan repot karena harus memindai daftar untuk melihat apakah ada duplikat dan lemparan. First() dan FirstOrDefault() berhenti pada pertandingan pertama, sehingga lebih efisien.

Dari keluarga First() dan Single(), di sinilah mereka melempar:

  • First() - melempar jika kosong/tidak ditemukan, tidak melempar jika duplikat
  • FirstOrDefault() - mengembalikan default jika kosong/tidak ditemukan, tidak membuang jika duplikat
  • Single() - melempar jika kosong/tidak ditemukan, melempar jika ada duplikat
  • SingleOrDefault() - mengembalikan default jika kosong/tidak ditemukan, melempar jika ada duplikat
160

FirstOrDefault atau SingleOrDefault mungkin berguna, tergantung pada skenario Anda, dan apakah Anda ingin menangani nol atau lebih dari satu kecocokan:

FirstOrDefault: Mengembalikan elemen pertama dari suatu urutan, atau nilai default jika tidak ada elemen yang ditemukan.

SingleOrDefault: Mengembalikan satu-satunya elemen urutan, atau nilai default jika urutannya kosong; metode ini melempar pengecualian jika ada lebih dari satu elemen dalam urutan

Saya tidak tahu bagaimana ini bekerja dalam permintaan linq 'from' tetapi dalam sintaks lambda terlihat seperti ini:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);
15
stuartd

Hanya untuk membuat hidup seseorang lebih mudah, permintaan linq dengan ekspresi lambda

(from x in Items where x.Id == 123 select x).FirstOrDefault();

tidak menghasilkan permintaan SQL dengan select top (1) di dalamnya.

10
Amal

Ini adalah metode yang disukai:

var item = Items.SingleOrDefault(x => x.Id == 123);

Atau

var item = Items.Single(x => x.Id == 123);
10
James Hill

Itu bisa lebih baik dipadatkan menjadi ini.

var item = Items.First(x => x.Id == 123);

Kueri Anda saat ini mengumpulkan semua hasil (dan mungkin ada lebih dari satu) dalam enumerable dan kemudian mengambil yang pertama dari it set, melakukan lebih banyak pekerjaan daripada yang diperlukan.

Single/SingleOrDefault bermanfaat, tetapi hanya jika Anda ingin mengulangi seluruh koleksi dan memverifikasi bahwa pertandingan itu unik selain memilih pertandingan itu. First/FirstOrDefault hanya akan mengambil pertandingan pertama dan pergi, terlepas dari berapa banyak duplikat yang benar-benar ada.

7
Chris Hannon

Anda dapat menggunakan sintaksis metode ekstensi:

var item = Items.Select(x => x.Id == 123).FirstOrDefault();

Selain itu, saya tidak yakin berapa banyak Anda bisa mendapatkan lebih ringkas, tanpa mungkin menulis sendiri metode ekstensi "First" dan "FirstOrDefault" khusus Anda.

3
wageoghe

Saya akan memberi tahu Anda apa yang berhasil untuk saya:

int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());

var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;

Id saya adalah baris yang ingin saya query, dalam hal ini saya mendapatkannya dari radGrid, lalu saya menggunakannya untuk query, tetapi query ini mengembalikan sebuah baris, maka Anda dapat menetapkan nilai yang Anda dapatkan dari query ke textbox, atau apa pun , Saya harus menugaskan mereka ke kotak teks.

1
G Jeny Ramirez