SORU
17 Ocak 2014, Cuma


`..` ya da `FirstOrDefault` SERİ içinde

Bir veritabanından bir kullanıcı için veri almaya çalıştım ve aşağıdaki yöntemi kullandım zaman geleneksel olarak, (bir dereceye kadar):

DbUsers curUser = context.DbUsers.FirstOrDefault(x => x.u_LoginName == id);
string name = curUser.u_Name;
string email = curUser.u_Email;

Tek istediğim Adını ve e-Posta almak olduğunu görebilirsiniz, ama bu SERİ sorgu oluyor gibi geliyor banaher şeyibu kullanıcı veritabanında saklanan, bunu geri getirdi, sonra da bana istediğim şeyi almak için izin.

Biraz araştırma yaptım ve aşağıdaki alternatif bulduk:

var current = from s in context.DbUsers
where s.u_LoginName == id
select new {
             name = s.u_Name, 
             email = s.u_Email
           };
foreach (var user in current)
{
    //Stuff Here
}

Eğer varsa, daha iyi olur muydu? Daha hafif bir yöntem ben sadece data / birkaç sonuç almak için kullanın.

CEVAP
17 Ocak 2014, Cuma


Eğer sadece iki alan elde etmek istiyorsanız, o zaman senin varlığın projeöncesorgu sonucuyla (ve bu durumda sorgu FirstOrDefault çağırdığınızda infaz ediliyor). Gerekli alanlar ile anonim nesneye projeksiyon için: Select operatör kullanın

var user = context.DbUsers
                  .Where(u => u.u_LoginName == id)
                  .Select(u => new { u.u_Name, u.u_Email })
                  .FirstOrDefault(); // query is executed here

string name = user.u_Name; // user is anonymous object
string email = user.u_Email;

Bu SQL gibi oluşturur:

 SELECT TOP 1 u_Name, u_Email FROM DbUsers
 WHERE u_LoginName = @id

İkinci durumda projeksiyon yapıyorsunuzöncesorgu sonucuyla (yani sayım başladı). Sadece gerekli alanları yüklenir. Ama sorgu (TOP 1) olmadan biraz farklı olacak. Aslında eğer lambda sözdizimi ikinci yaklaşım dönüştürmek, hemen hemen aynı olacak:

var query = context.DbUsers
                   .Where(u => u.u_LoginName == id)
                   .Select(u => new { u.u_Name, u.u_Email }); 

// query is defined but not executed yet
foreach (var user in query) // executed now
{
   //Stuff Here
}

Ve sadece tam bir resim, ilk bulunan tüm kullanıcı alanları olsun projeksiyon olmadan göstermek için:

DbUsers user = context.DbUsers
                      .Where(u => u.u_LoginName == id)
                      .FirstOrDefault(); // query is executed here

string name = user.u_Name; // user is DbUsers entity with all fields mapped
string email = user.u_Email;    

Bu durumda kullanıcı varlık sorgu yürütülmeden önce öngörülen ve kullanıcı tüm alanları veritabanından yüklenir ve kullanıcı varlık eşleştirilmiş

 SELECT TOP 1 u_LoginName, u_Name, u_Email /* etc */ FROM DbUsers
 WHERE u_LoginName = @id

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • Defence Videos

    Defence Vide

    13 Mayıs 2013
  • ::..ηєѕѕ мιχ..::

    ::..ηєѕѕ

    15 Aralık 2006