2011-12-17 9 views
0

このクエリを実行するより効率的な方法はありますか?生成されたEFクエリにこのLinqを行うより効率的な方法はありますか?

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

は、ニックはこれが適切に設計されていると仮定していることに基づいて、多対多の関係ので修正答えを説明しました。

これを適切に管理するには、inbetweenテーブルが必要です。私は、このデザインを意味するように、このテーブルを含む必要があるため、リストにないテーブルを作成します。

のテーブルがあるとしましょう:

cityIDとユーザIDを想定し
table CitiesAndUsers 
    column cityId int 
    column userId int 

は、ラムダのための今すぐ

、それぞれのテーブルに複合キーと外部キーです

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

理にかなっていますか?

+0

これは 'User'と' City'の多対多の関係です。 'u => u.City'は' City'のコレクションなので、これはうまくいきません –

+0

これは今でも些細なことです。私はあなたのために編集します。 –

+0

それが正しいのではない場合は、あなたの質問に戻り、テーブルの詳細を書いてください。そうすれば、より良い答えを得ることができます。乾杯。 –

0

私はあなたがこのような簡単にそれを行うためにあなたの牽引テーブル間の関係を作成することができると思います。

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

をしかし、あなたはどんな関係アウトして、私はちょうどあなたが正しいことを行うと言うことを行うことを余儀なくされている場合あなたのソリューションで

関連する問題