Что такое эффективный запрос Entity Framework, чтобы проверить, являются ли пользователи друзьями? - PullRequest
8 голосов
/ 07 июня 2011

Существует таблица с именем 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)
        ));
}

Есть ли лучший способ, чем || здесь?

1 Ответ

6 голосов
/ 07 июня 2011

Я думаю, что если столбцы User1ID и User2ID являются столбцами первичного ключа, этот запрос вызывает поиск по индексу и является настолько эффективным.Настройка запроса, когда он критичен, без анализа плана выполнения, неэффективна.Для важных запросов я предлагаю вам использовать SQL Server (или любую СУБД) для написания и анализа ваших запросов, а затем преобразовывать эти запросы в запросы LINQ.Это не сложно.

...