在MVC 3項目中使用Linq to Entity(Entity Framework)。涉及連接的複雜sql查詢的Linq和Lambda表達式
我的模型:
表 - 用戶
用戶ID(PK)
...
表 - 客戶
客戶端ID(PK)
表 - PropertyItems
PropertyItemID(PK )
Table - MemberContactPreference(C ontains選擇通過用戶 - 多對多)
用戶ID(FK)
PropertyItemID(FK)
表ClientProperties(包含屬於客戶PropertyItems PropertyItems - 多對多)
客戶端ID(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在Lambda表達式中執行此操作的任何建議。
感謝
林不太確定我明白你要做什麼,但我注意到的一件事是,當你找回它時,你還沒有枚舉集合。這意味着它保持爲可查詢狀態,使用'GetAllUsers(),ToArray()'和'GetClientProperties(ClientID).ToArray()'來確保這些集合在下一個查詢之前在內存中,因爲它會在db上執行我不認爲你的意圖是 –