2011-06-07 38 views
8

Hay una tabla llamada UserFriends que contiene registros de las amistades de los usuarios. Para cada amistad, sólo hay uno registro,¿Qué es una consulta eficiente de Entity Framework para verificar si los usuarios son amigos?

User1ID User2ID IsConfirmed 
1  2  true 

que es igual en términos de la lógica de negocio a

User1ID User2ID IsConfirmed 
2  1  true 

pero tanto no se puede pasar por un par.

¿Cuál es el más eficiente (todavía legible y que no impliquen SQL sin formato) Entity Framework consulta para determinar si el usuario A es un amigo del usuario B, teniendo en cuenta que no sabemos cuál de ellos está en primera o segunda columna ?

Mi intento es claro y evidente:

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

¿Hay una manera mejor que || aquí?

+2

si las columnas User1ID y User2ID son columnas de clave principal, esta consulta causa la exploración de índice y es tan eficiente. ¿Has visto el plan de ejecución de esta consulta? – Arian

+0

@Nima: No, no lo hice. Entonces, ¿tenerlos a ambos como claves hace que la consulta sea eficiente? No soy realmente un tipo de base de datos y aprecio la entrada como esta. ¿Puedes publicar tu comentario como respuesta para poder votarlo y marcarlo como correcto si no aparece nada más? –

+0

@gaearon - No, no son "ambas claves", son la clave, cuando crea su clave principal/índice agrupado en la tabla, debe estar en User1ID y UserID2. – Phill

Respuesta

6

Creo que si las columnas User1ID y User2ID son columnas de clave principal, esta consulta causa una búsqueda de índice y es muy eficiente. El ajuste de una consulta cuando es crítico, sin analizar el plan de ejecución, es ineficiente. Para consultas importantes, sugiero que use SQL Server (o cualquier DBMS) para escribir y analizar sus consultas y luego convertir estas consultas a consultas LINQ. No es dificil.

Cuestiones relacionadas