【发布时间】:2012-05-12 21:32:43
【问题描述】:
在 MVC 3 项目中使用 Linq to Entity(实体框架)。
我的模特:
表 - 用户
用户 ID (PK)
...
表 - 客户
客户 ID (PK)
表格 - 属性项
属性项 ID (PK)
表 - MemberContactPreference(包含用户选择的 PropertyItems - 多对多)
用户 ID(FK)
PropertyItemID(FK)
表 ClientProperties(包含属于 Clients 的 PropertyItems - 多对多)
客户 ID (FK)
属性项 ID (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 中的项目数。实际上它用新的结果集替换了集合。我想在每次迭代中过滤掉这个集合。
此外,任何建议在 Lambda 表达式中执行此操作而不使用 Linq。
谢谢
【问题讨论】:
-
我不太确定我是否理解您要执行的操作,但我注意到的一件事是您在取回该集合时并未枚举该集合。这意味着它保持可查询状态,使用
GetAllUsers().ToArray()和GetClientProperties(ClientID).ToArray()确保这些集合在下一次查询之前在内存中,因为目前这将在数据库上执行,我认为这不是你想要的
标签: linq entity-framework lambda