6

一緒に結合したいテーブルがいくつかあります。

  • ユーザー
  • UserRoles
  • WorkflowRoles
  • 役割
  • ワークフロー

私が生成したい同等のSQLは次のようなものです

select * from Users u
inner join UserRoles ur on u.UserId = ur.UserId
inner join WorkflowRoles wr on wr.RoleId = ur.RoleId
inner join Workflow w on wr.WorkflowId = w.Id
where u.Id = x

1つのクエリでの役割に基づいて、ユーザーが参加しているすべてのワークフローを取得したいと思います。次のような結果が得られることがわかりました。

user.Roles.SelectMany(r => r.Workflows)

ただし、これにより、ロールごとにクエリが生成されますが、これは明らかに理想的とは言えません。

ビューの生成やストレートSQLの記述などのハックに頼ることなくこれを行う適切な方法はありますか?

4

3 に答える 3

9

次の 2 つのクエリを試すことができます。

これは読みやすいと思います:

var workflows = context.Users
    .Where(u => u.UserId == givenUserId)
    .SelectMany(u => u.Roles.SelectMany(r => r.Workflows))
    .Distinct()
    .ToList();

(Distinctユーザーは 2 つのロールを持つことができ、これらのロールには同じワークフローが含まれる可能性があるためです。Distinct重複したワークフローがなければ返されます。)

しかし、これはより良いパフォーマンスを発揮すると私は信じています:

var workflows = context.WorkFlows
    .Where(w => w.Roles.Any(r => r.Users.Any(u => u.UserId == givenUserId)))
    .ToList();
于 2013-01-16T21:17:15.283 に答える
1

したがって、選択した順序によって違いが生じることがわかります。

user.Select(x => x.Roles.SelectMany(y => y.Workflows)).FirstOrDefault()
于 2013-01-16T21:13:46.790 に答える
0

これをテストする機会はありませんでしたが、うまくいくはずです:

Users.Include(user => user.UserRoles).Include(user => user.UserRole.WorkflowRoles.Workflow) 

上記が正しくない場合、クラス構造を投稿することは可能ですか?

于 2013-01-16T20:49:23.633 に答える