Есть ли более эффективный способ сделать этот запрос Linq to EF? - PullRequest
0 голосов
/ 17 декабря 2011

Есть ли более эффективный способ сделать этот запрос?

var subscriptions = from user in Db.User
                    from city in Db.City
                    where user.City.Select(x => x.Id).Contains(city.Id)
                       && user.Id == User.Id
                    select city.Id;

Сгенерированный оператор

SELECT 
[Extent2].[Id] AS [Id]
FROM  [dbo].[User] AS [Extent1]
CROSS JOIN [dbo].[City] AS [Extent2]
WHERE ( EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[UserCity] AS [Extent3]
    WHERE ([Extent1].[Id] = [Extent3].[UserId]) AND ([Extent3].[CityId] = [Extent2].[Id])
)) AND ([Extent1].[Id] = @p__linq__0)

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

я думаю, что вы можете создать связь между вашим буксирным столом, чтобы сделать это проще, как это:

Db.User.City.Select(x => x.Id) 

, но если вы вынуждены делать это без каких-либо отношений, я просто говорю, что вы делаете этопрямо с вашим решением

0 голосов
/ 17 декабря 2011

Ник объяснил это отношением «многие ко многим», поэтому изменил ответ, исходя из того, что предполагается, что он разработан правильно.

Для правильного управления вам понадобится промежуточная таблица. Я составлю таблицу, которой нет в списке, поскольку она должна содержать эту таблицу, чтобы этот дизайн имел смысл.

Допустим, есть таблица:

table CitiesAndUsers
    column cityId int
    column userId int

при условии, что cityID и userID являются составными ключами и внешними ключами для соответствующих таблиц

Теперь за лямду

var subscriptions = Db.CitiesAndUsers.Where(cu => cu.User.Id == User.Id).Select(cu => cu.City.id);

Имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...