web-dev-qa-db-ja.com

エンティティフレームワークでIDによって要素のリストを取得します

別のリストにあるすべての要素をIDで取得するにはどうすればよいですか?例えば;リストの役割があります。このリストにあるすべてのロールを、IDで取得したいと思います。

コードファーストを使用しています。

私はこれを行い、エラーを投げました:

var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId));

RoleIdはint型です。

エラー:

'SampleMVC.Domain.Role'タイプの定数値を作成できません。このコンテキストでは、プリミティブ型(「Int32、String、Guidなど」)のみがサポートされています。

25
Shawn Mclean
var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
64
moi_meme

User.Rolesがintのリストである場合、次のように動作します。

var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId));

これにより、SQLの「SELECT WHERE IN(x、y、z ...)」に変わります。

11
Chris Smith

ローカルリストとリモートデータを組み合わせることはできません。データは(クライアント上に)存在しないため、dbから読み取るものはありません。

あなたがやろうとしていることに対するより良い解決策があるかもしれないと思う。

特定のユーザーに割り当てられているすべてのロールを取得しようとしているようです。その場合は、現在のユーザーIDをデータベースに渡し、INNER JOINが割り当てられたロールを取得するソリューションを提案します。

データベースによっては、次のようになります(「UserRoles」というテーブルを介してユーザーをロールに接続している場合)

var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role)

(もちろん、dbで直接必要な場合は、「ロール」のリストを返すストアドプロシージャを作成してマップすることもできます。)

1
Jonas Stensved