有更有效的方法来执行此查询吗?
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)
答案 0 :(得分:0)
Nick解释了它的多对多关系,因此根据假设设计得当而修改答案。
您需要一个inbetween表来正确管理它。我将组成一个未列出的表,因为它必须包含此表才能使这个设计有意义。
假设有一张表:
table CitiesAndUsers
column cityId int
column userId int
假设cityID和userID是复合键和各自表的外键
现在为lamda
var subscriptions = Db.CitiesAndUsers.Where(cu => cu.User.Id == User.Id).Select(cu => cu.City.id);
有道理吗?
答案 1 :(得分:0)
我认为你可以在你的两个表之间创建一个关系,这样做更容易:
Db.User.City.Select(x => x.Id)
但如果你被迫在没有任何关系的情况下这样做,我只是说你用你的解决方案做到了这一点