2017-12-01 31 views
0

私は1対多数の関係を持つ3つの関連するエンティティを持っています。 アカウントの1- *これらのそれぞれは、ユーザーとの多くの関係に多くを持っている多対多関係のフィルタリング

コレクションの1- *項目

私はコレクションのリストを取得しようとしている(テーブルAccountManagers、CollectionManagers、ItemManagersに参加して)ユーザがいずれかの結合テーブルに入っている場合 私は3つの式を作成し、最後に3つの結果をマージして何らかの形で重複を取り除くと考えていました。 ラムダ式が行く方法だと思われましたが、私はまだそれらを学んでいます。

は私が

真ん中の1が db.Collections.where(C => C.CollectionManagers.UserID == CurrentUserID)のような、より簡単だと思うしかし、どのようにユーザーからのコレクションのリストを集めるでしょうマネージャを占めますとアイテムマネージャのエントリ? LINQを使用して、事前

+0

' CollectionManagers'は、多くの多くのリストである(C => c.CollectionManagers.Any(=> a.UserID == CurrentUserID))) 'を実行します。 – NetMage

+0

あなたが話しているエンティティクラスの関連部分(特にナビゲーションプロパティ)を投稿すると、助けがはるかに簡単になります。 –

答えて

0

おかげで、Unionオペレータはので、各カテゴリを組み立てるし、それらが動作するはず組み合わせ、唯一のユニークなコレクションの行を返します。

はアイテムのために、私は現在のユーザーによって管理されているすべてのアイテムを見つけることが最も効率的で、その後、彼らが属しているすべてのコレクションに見つけるだろうと思った:

var iCollections = Items.Where(i => i.ItemManagers.Any(im => im.UserId == CurrentUserID)).SelectMany(i => Collections.Where(c => c.Items.Contains(i))); 

この他の方法を行うことも可能です、例えば現在のユーザーによって管理される項目を含むすべてのコレクションを見つける:コレクションのために

var iCollections = Collections.Where(c => c.Items.Any(i => i.ItemManagers.Any(im => im.UserId == CurrentUserID))); 

を、あなたが指摘したように、あなただけの現在のユーザーがコレクションを管理するすべてのコレクションを見つける必要がある:

var cCollections = Collections.Where(c => c.CollectionManagers.Any(cm => cm.UserId == CurrentUserID)); 

アカウントのために、私たちは現在のユーザーが管理するすべてのアカウントとアカウントが所有するすべてのコレクションを見つける:

var aCollections = Accounts.Where(a => a.AccountManagers.Any(am => am.UserId == CurrentUserID)).SelectMany(a => a.Collections); 

次にあなたがRESUをUnionすることができます一緒にLTS:あなたはもっとCollections.Where `のようなものを必要とするので、

私が想定し
var CurrentUserCollections = iCollections.Union(cCollections).Union(aCollections); 
+0

ありがとうございます。私はあなたが他の声明の中にさらに "私"を置くことができるとは気付かなかった。 ))。SelectMany(i => Collections.Where(c => c.Items.Contains(i))); – Rob

+0

ラムダはデリゲートの単なる短縮形であり、関数の省略形であり、ブロックのように親スコープにアクセスできることを覚えておいてください。 – NetMage