2011-06-07 27 views
8

有一張名爲UserFriends的表格,用於保存用戶友誼的記錄。 對於各好友中,只有一個記錄什麼是有效的實體框架查詢來檢查用戶是否是朋友?

User1ID User2ID IsConfirmed 
1  2  true 

這是在業務邏輯方面等於

User1ID User2ID IsConfirmed 
2  1  true 

不可能發生的一對。

什麼是最有效的(但可讀的,不涉及純SQL)Entity Framework查詢,以確定如果用戶A是用戶B的朋友,考慮到我們不知道其中哪些是在第一或第二列?

我的嘗試是平原和明顯:

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

難道還有比這裏||一個更好的辦法?

+2

如果User1ID和User2ID列都是主鍵列,則此查詢會導致索引掃描並且效率很高。你看到這個查詢的執行計劃嗎? – Arian 2011-06-07 09:38:36

+0

@Nima:不,我沒有。那麼,是否將它們都作爲關鍵字使查詢有效?我不是一個真正的數據庫人,喜歡這樣的輸入。您能否請您發表評論作爲答案,以便我可以放棄它,並且如果沒有其他事情出現,請將其標記爲正確? – 2011-06-07 09:44:25

+0

@gaearon - 當它在表上創建主鍵/聚簇索引時,它們不應該是「鍵都是鍵」,它們應該跨越User1ID和UserID2。 – Phill 2011-06-07 11:31:43

回答

6

我想如果User1ID和User2ID列都是主鍵列,這個查詢會導致索引查找並且效率很高。在不分析執行計劃的情況下對查詢進行調優時效率低下。對於重要的查詢,我建議您使用SQL Server(或任何DBMS)編寫和分析您的查詢,然後將這些查詢轉換爲LINQ查詢。這並不難。

相關問題