2009-07-24 24 views
2

.Net Entity FrameworkとLinqでは、エンティティコレクションにいくつかの値のいずれかが含まれているかどうかの検索を実装するための最良の(読みやすい/理解しやすい)方法を見つけるのに問題があります。エンティティコレクションに複数の値のいずれかが含まれているかどうかを確認するにはどうすればよいですか?

基本的なメンバーシップ/ロールの実装を考えてみましょう。ユーザーにはロールコレクションがあります。

「このユーザーは、role1、role2、またはrole3のいずれかのロールを持っていますか」と言うのに最適な方法は何ですか?

私はのように、チェックするために1つの役割でそれを行うことができます。

if myUser.Roles.Contains(role1) { // do something } 

を、このチェックに多くの役割を追加するための簡単な方法はありますか?役割のリストはコンパイル時にわかっている場合

答えて

2

、その後、あなたはこのような何かを行うことができます。

if (myUser.Roles.Count(r => r.Id == role1.Id || r.Id == role2.Id) > 0) 
{ 
    // do something 
} 

を使用すると、役割の動的に構築されたリストに対してチェックしたい場合は、それがトリッキー取得します。これがあなたが必要とするものなのかどうか教えてください。

EDITEDCount() > 0Any()を変えた - 私はL2SQL対L2Eにmisrememberedこの制限を持っていました。

+0

.ANY()エンティティへのLINQに有効であると思われる....しかし、これは私は何のように見えるしません:あなたは、存在チェックを行うためAny()方法と役割のIDチェックを組み合わせることができます... –

2

EDIT:私はちょうどいくつかのテストを実行しました。面白いのは、INとORのためにかなり同じです、面白いSQLのほかに、彼らはほとんど同じことを実行します。 これを反映するために私の回答を編集しました。私はあなたが達成しようとしているものと信じて

「IN」スタイルのクエリは(まだ)EFによって、本質的にサポートされない はhere

をカバーしてきたあなたは、このようなものと一致するエンティティ入手することができます。

 var roleNamesToMatch = {"Admin","Manager","Associate"}; 
     var expression = BuildOrExpression<Role, name>(r => r.Name, roleNamesToMatch); 
     var matchingRoles = context.RoleSet.Where(expression); 
を代わりに

select r.ID,r.Name from t_Role where r.Name = 'Admin' OR r.Name = 'Manager' 
OR r.Name = 'Associate' 

O:式ツリーに基づいて

は、EFは、次のようになりますSQLを作成しますF 1は、通常、必要以上の作業を行いますCount()を使用して

select r.ID,r.Name from t_Role where r.Name in ('Admin','Manager','Associate') 
+0

IN(...)と一連のOR文の間にSQLパフォーマンスの違いはありません。クエリ計画の面では同じです。 –

+0

あなたはそうです...私はこれを反映するために私の回答を編集しました。 –

0
var checkForRoles = new Role[] { Role1, Role2, Role3 }; 

if (myUser.Roles.Any(r => search.Contains(checkForRoles))) { 
    //the user is in one of the roles. 
} 
+1

エンティティフレームワークはContains()をサポートしていません。また、Contains()は配列やIEnumerableをパラメータとして受け取らないため、これが何をすべきか分かりません。 –

+0

あなたは正しいです。私は、EFがContainsをサポートしていないことに気づいていませんでした。私は、テストする動的なリストを持つ方法を探していました。私は今朝テストをしていましたが、EFはインターセクトでも動作していないようです - 私はL2Sに甘やかされました。 –

+0

EFでContainsスタイルの動作を達成する唯一の方法は、ExpressionTreeを使用することです。 –

1

を期待するだろうか。

if(myUser.Roles.Any(role => role.Id == role1.Id || role.Id == role2.Id) 
{ 
    // ... 
} 
関連する問題