2011-06-07 16 views
8

Kullanıcıların arkadaşlıklarına ilişkin kayıtları tutan UserFriends adlı bir tablo var. Her dostluk , bir çifti için olamazKullanıcıların arkadaş olup olmadığını kontrol etmek için verimli bir Entity Framework sorgusu nedir?

User1ID User2ID IsConfirmed 
2  1  true 

ama hem iş mantığı açısından eşittir sadece bir kayıt,

User1ID User2ID IsConfirmed 
1  2  true 

yoktur.

nedir en verimli A kullanıcısı B arkadaşı ise biz ilk ya da ikinci sütunda ise bunlardan hangisinin bilmiyorum gözönüne alınarak, söz Entity Framework sorgu (düz SQL karıştığı henüz okunabilir değil) ?

girişimim düz ve açıktır: Burada || daha iyi bir yolu

public bool AreFriends (int user1Id, int user2Id) 
{ 
    return MyObjectContext.UserFriends 
     .Any (uf => uf.IsConfirmed && (
        (uf.UserID == user1Id && uf.FriendUserID == user2Id) 
        || (uf.UserID == user2Id && uf.FriendUserID == user1Id) 
     )); 
} 

var mı?

+2

User1ID ve User2ID sütunları her ikisi de birincil anahtar sütunlarsa, bu sorgu nedenleri İndeks taraması ve çok etkilidir. Bu sorgunun yürütme planını gördünüz mü? – Arian

+0

@Nima: Hayır yapmadım. Öyleyse, ikisi de anahtar olarak sorguyu verimli hale getiriyor mu? Ben gerçekten bir veritabanı adamı değilim ve bunun gibi girdileri takdir ediyorum. Yorumunuzu cevap olarak gönderebilir misiniz, böylece cevap verebilir ve başka bir şey kalmazsa doğru olarak işaretleyebilir miyim? –

+0

@gaearon - Hayır, her ikisi de anahtar olarak değil, anahtar onlardır; ana anahtar/kümelenmiş dizininizi oluşturduğunuzda, hem User1ID hem de UserID2 arasında olmalıdır. – Phill

cevap

6

User1ID ve User2ID sütunlarının her ikisi de birincil anahtar sütunlarsa, bu sorgu bir dizin aramasına neden olur ve bu nedenle çok verimli olur. Kritik olduğunda sorgulamanın, yürütme planını analiz etmeden ayarlanması, verimsizdir. Önemli sorgular için, SQL Server (veya herhangi bir DBMS), sorgularınızı yazmak ve çözümlemek ve bu sorguları LINQ sorgularına dönüştürmek için kullanmanızı öneririm. Zor değil.

İlgili konular