私はこのデータベーススキーマを持っています:
User <-- UserRole --> Role
Role テーブルにはいくつかの列がありますが、主キーにのみ関心があり、UserRole の外部キーからそれを取得できるため、Role テーブルに参加する必要はまったくありませんが、方法がわかりませんEFでそのテーブルに参加しないようにします。
私はこのコードを試しました:
context.Users.Where(u => u.UserId == x).Single().Roles.Select(r => r.RoleId);
これにより、2 つのクエリが生成されます。user テーブルに 1 つ、UserRole と Role の結合に 1 つ。もちろん、.Include("Roles") または SelectMany() を使用して 1 つのクエリに減らすこともできますが、そのクエリでは 3 つのテーブルが結合されます。余分な結合を取り除く方法はありますか? SQL を次のようにしたい:
SELECT u.*, ur.RoleId
FROM User u
LEFT OUTER JOIN UserRole ur on ur.UserId = u.UserId
WHERE ...
実際にはオートマッパーを使用していますが、この例は同じ問題を示していると思います。Roles は小さなテーブルなので、今回はパフォーマンスの低下に耐えることができますが、手書きの SQL ほど効率的ではないことに悩まされています。私の前に他の誰かがこれに遭遇し、解決策を見つけましたか?