MVC 3プロジェクトのLinq to Entity(Entity Framework)の使用。結合を含む複雑なSQLクエリのLinqとLambda式
マイモデル:
表 - ユーザー
ユーザーID(PK)
...
表 - クライアント
クライアントID(PK)
表 - PropertyItems
PropertyItemID(PK )
テーブル - MemberContactPreference(C多くの多くの)
クライアントID(FK)
PropertyItemID( - ontains PropertyItemsはUsers-多くの多くの)
ユーザーID(FK)
PropertyItemID(FK)
表のClientProperties(クライアントに属しPropertyItemsが含まれていますが選択しました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を使用せずにラムダ式でこれを行うための提案。 forループ内のIQueryableの生成がモンスターSQLで終わる可能性がある、危険なことのように思える
おかげ
私はあなたが何をしようとしているのか理解していますが、私が気づいていることは、あなたが戻ってくるときにその列挙を列挙していないということです。つまり、GetAllUsers().ToArray()およびGetClientProperties(ClientID).ToArray()を使用して、これらのセットが次のクエリの前にメモリに格納されていることを確認します。私はあなたが意図しているとは思わない –