2012-09-22 21 views
15

olmadan Bul kullanarak dbSet rekor bulun:Bir kullanıcıların tablo var birincil anahtar

Users: 
+ID 
+Username 
+... 

Bir kullanıcıları yüzgeç myDBContext.Users.Find(Username) kullanmak istiyorum. Şu anki bağlamımda kimliğini kullanamam.

Tam bir LINQ sorgusu kullanmalı mıyım? Örneğin.

var user = from users in myDBContext.Users.Find(Username) 
      where users.Username == username 
      select users 
Ben de EDMX birincil anahtar olarak adını tanımlamak için çalıştık ama bu şu hata ile sonuçlandı

: buldum

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

cevap

35

Şu tabloyu deneyin: , Single belgesine sahiptir. Kullanıcı yoksa Single bir hata atar.null geri dönecek ise, aksi takdirde kullanıcı User nesnesi geri dönecektir.

Sen puanın altında dikkate kullanmak SingleOrDefault ve FirstOrDefault kullanarak ancak seçme hangi yöntemin ise kullanıcı nesnesini alabilirsiniz

SingleOrDefault ila FirstOrDefault seçilmesi.

  • Aksi takdirde varsayılan değer varsa, her ikisi de yalnızca koleksiyondan/veritabanından bir değer döndürür.
  • Aynı adda birden fazla kullanıcınız varsa ve LINQ sorgusu gerçekleştirirken bir istisna almayı bekliyorsanız, birden fazla öğe varsa, istisna atılacağından SingleOrDefault kullanın.
  • Eğer istisna istemiyorsanız ve/veya koleksiyonunuzun/veritabanınızın verilerin çoğaltıldığını kontrol etmek istemiyorsanız, sadece koleksiyondan/veritabanından ilk değer almak istediğinizde, daha iyi performans için FirstOrDefault kullanın SingleOrDefault ile karşılaştırın

FirstOrDefault

  • Genel FirstOrDefault ya da toplama veya veri tabanından tek bir değer (ilk) gerektiğinde kullanılır First.
  • Fist/FirstOrDefault durumunda, veritabanından yalnızca bir satır alınır ve böylece tek/SingleOrDefault'dan biraz daha iyi performans gösterir. Böyle küçük bir fark pek fark edilmez ancak tablo çok sayıda sütun ve satır içerdiğinde, bu noktada performans fark edilir.

Diğer bazı açıklamalar username birincil anahtar sonra ise orada SingleOrDefault ve birincil anahtar olarak FirstOrDefault performansı arasında hiçbir pek/hiçbir fark indeksini gelmiştir olmalı ve olacak her zaman endeks sütun üzerinde arama düşünüyorum

  • normal sütundan daha hızlı olun.
  • Single veya SingleOrDefault, "SELECT ..." gibi düzenli bir TSQL oluşturur.
  • First veya FirstOrDefault yöntem
+0

daha da iyisi! .. Teşekkürler. – Mortalus

+0

Bunun yerine 'FirstOrDefault' kullanmak daha iyi olmaz mıydı? 'SingleOrDefault' yöntemini anladığımda, yalnızca bir kaydın bu koşulla eşleştiğinden emin olmak için * tüm * tabloya göz atacağıdır. OP'nin istediği şey bu olmayabilir. – Crono

+1

@Crono Evet, performansının SingleOrDefault ile karşılaştırıldığını düşünürsek, FirstOrDefault için haklısınız. Ama burada beklenen sonuca bağlı olarak bence bu iki yöntem arasında seçim yapmalıyız. Yalnızca tek bir sonuç istiyorsanız ve birden fazla sıra varsa, bir istisna bekliyorsanız, SinleOrDefault kullanın aksi halde FirstOrDefault kullanın. Cevabımı bu bağlamda güncelleyeceğim. –

3

o:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username); 
+0

Evet ok "... TOP 1 SEÇ" gibi TSQL statment oluşturacak ancak sizin sorun için çözüm beri cevap olarak kabul etmelisin. –

+0

Peki bana sadece iki gün içinde kabul edebileceğimi söylüyorum, bu yüzden bekleyeceğim .. tnx – Mortalus

+0

@Mortalus, sorunuza yardımcı olursa cevabımı bul. Tekli TekliDeğiştir ayarını değiştirdim. –

İlgili konular