MVC 3 プロジェクトで Linq to Entity (Entity Framework) を使用します。
私のモデル:
表 - ユーザーのユーザー
ID (PK)
...
表 - クライアント
ClientID (PK)
表 - PropertyItems
PropertyItemID (PK)
テーブル - MemberContactPreference (ユーザーが選択した PropertyItems を含む - 多対多)
UserID(FK)
PropertyItemID(FK)
テーブル ClientProperties (クライアントに属する PropertyItems を含む - 多対多)
ClientID (FK)
PropertyItemID (FK)
クライアントが選択したすべてのプロパティを選択したすべての個別のユーザーを一覧表示したいと考えています。
私のアプローチ:
特定のクライアントのすべてのプロパティのリストを取得しました
Iqueryable<ClientProperty> clientProperties = GetClientProperties(ClientID)
Iqueryable<User> UsersMatchingClientProperties = GetAllUsers();
foreach (ClientProperty property in clientproperties)
{
UsersMatchingClientProperties = (from uem in UsersMatchingClientProperties
join ucp in GetAllMemberContactPreferences on
ucp.UserID == uem.UserID
where uem.MemberContactPreferences.SelectMany(
mcp => mcp.PropertyItemID == property.PropertyItemID)
select uem).Distinct;
}
最初だけ正しい結果が得られます。各反復で UsersMatchingClientProperties の項目数が減らないためです。実際には、コレクションを新しい結果セットに置き換えます。各反復でこのコレクションを除外したいと思います。
また、Linq を使用せずにラムダ式でこれを行うための提案。
ありがとう