是否有更有效的方法来执行此Linq到EF查询?

时间:2011-12-17 06:08:07

标签: c# entity-framework-4.1

有更有效的方法来执行此查询吗?

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 :(得分: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) 

但如果你被迫在没有任何关系的情况下这样做,我只是说你用你的解决方案做到了这一点