2017-08-25 19 views
0

多くのプロパティを持つオブジェクトのリストがあります。私はオブジェクトリストの特定のプロパティに一致するすべてのレコードを取得するEF6クエリを記述したいと思います。Entity Framework 6多次元オブジェクトのIN条件

これは私が動作していないものです。

userRolesは私のList<>であり、RoleIDは、エンティティのRoleIdと照合したいプロパティです。

List<DataAccess.Entities.DB.StorageContainerRole> 
    containerRoles = db.StorageContainerRoles 
         .Where(x => userRoles.Select(y => y.RoleID.Value) 
         .Contains(x.RoleId.Value)) 
         .Include(z => z.StorageContainer) 
         .ToList(); 

これは私が取得していますエラーです:

型 'DataAccess.Entities.DB.UserRole' が一定の値を作成することができません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。

助けていただけたら幸いです!

+0

どのように機能していないのですか?あなたのデータをチェックしましたか?あなたの質問は大丈夫です。 –

+0

質問にエラーを追加しました – Nugs

+0

'userRoles.Select(y => y.RoleID.Value)'をクエリの外に変数に代入し、変数inside(EF6要件)を使用します。 –

答えて

1

EFはクエリをSQLに変換する必要があり、複雑な(プリミティブではない)構造をどうしたらよいかわからない。 あなたの例ではuserRoles.Select(y => y.RoleID.Value)をクエリの外に置くことができます。これはプリミティブ型のコレクションを提供します。これはEFで解析できるはずです。より複雑な場合、例えば、。あなたはORチェーンとしてSQL句を構築するためにEFを強制する必要がありx.RoleId == a && x.RoleType == b:拡張コードと、それは簡単な例でORクエリを作成する方法について説明しWHERE (roleid = 1 AND roletype = 7) OR (roleid = 2 AND roletype = 8)チェックthis linkは、すでにフェッチされたユーザーの役割のリストを持っている場合は、あなたが構築することができ

+0

foreachループを実行している変数を上書きしているため、使用する変数は意味をなさない。また、 '.Where()'ステートメントの組み合わせは 'AND'で構築され、' OR'では構築されません – Progman

+0

間違った変数名です。 「AND」に関しては正しいです。ありがとう – ASpirin

2

を提供しましたidsのリストと照会でこのリストを確認してください:

IList<int> userRoleIds = userRoles.Select(it => it.RoleId.Value).ToList(); 

IList<StorageContainerRole> containerRoles = db.StorageContainerRoles 
    .Include(z => z.StorageContainer) 
    .Where(x => userRoleIds.Contains(x.RoleId)) 
    .ToList(); 
関連する問題