过滤多对多关系

时间:2017-12-01 00:03:56

标签: entity-framework asp.net-web-api lambda linq-to-sql

我有3个相关实体,有1对多关系。 帐户1- *收集1- *项目

每个人都与用户有多对多的关系(使用连接表AccountManagers,CollectionManagers,ItemManagers)

我试图获取用户的列表,如果他在任何联接表中。 我正在考虑创建3个表达式,然后在最后合并3个结果,并以某种方式删除重复项。 似乎Lambda的表达方式是可行的,但我还在学习它们。

我认为中间的一个比较简单 db.Collections.where(C => C.CollectionManagers.UserID == CurrentUserID)

但是,您如何从用户帐户管理员和项目经理条目中收集集合列表?

提前致谢

1 个答案:

答案 0 :(得分:0)

使用LINQ,Union运算符将仅返回唯一的Collection行,因此汇编每个类别并将它们组合起来应该有效。

对于Items,我认为找到当前用户管理的所有项目然后查找他们所属的所有馆藏是最有效的:

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);

然后你可以Union结果:

var CurrentUserCollections = iCollections.Union(cCollections).Union(aCollections);