8

Il existe une table appelée UserFriends qui contient des enregistrements pour les amitiés des utilisateurs. Pour chaque amitié, il y a juste un recordQu'est-ce qu'une requête Entity Framework efficace pour vérifier si les utilisateurs sont amis?

User1ID User2ID IsConfirmed 
1  2  true 

qui est égale en termes de logique métier à

User1ID User2ID IsConfirmed 
2  1  true 

mais les deux ne peut se produire pour une paire.

Ce qui est le plus efficace (encore lisible et ne comportant pas SQL ordinaire) Entity Framework de requête pour déterminer si l'utilisateur A est un ami de l'utilisateur B, étant donné que nous ne savons pas lequel d'entre eux est dans la première ou la seconde colonne ?

Ma tentative est simple et évidente:

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

Y at-il une meilleure façon que || ici?

+2

Si les colonnes User1ID et User2ID sont toutes les deux des colonnes de clé primaire, cette requête provoque l'analyse d'index et est si efficace. Avez-vous vu le plan d'exécution de cette requête? – Arian

+0

@Nima: Non je ne l'ai pas fait. Donc, les avoir tous les deux comme clés rendent la requête efficace? Je ne suis pas vraiment un type de base de données et apprécie la contribution comme ceci. Pouvez-vous s'il vous plaît poster votre commentaire comme une réponse afin que je puisse le convertir, et le marquer comme correct si rien d'autre ne se présente? –

+0

@gaearon - Non, ils ne sont pas 'les deux clés' ils sont la clé, quand vous créez votre clé primaire/index cluster sur la table, il doit être à la fois à travers User1ID et UserID2. – Phill

Répondre

6

Je pense que si les colonnes sont les deux colonnes de clé primaire User1ID et User2ID cette requête provoque un index et rechercher est si efficace. L'optimisation d'une requête lorsqu'elle est critique, sans analyser le plan d'exécution, est inefficace. Pour les requêtes importantes, je vous suggère d'utiliser SQL Server (ou n'importe quel SGBD) pour écrire et analyser vos requêtes, puis de convertir ces requêtes en requêtes LINQ. Ce n'est pas dur.

Questions connexes