[英]LINQ: Filter by value in sub list
I have obtained a list like this:我已经获得了这样的列表:
int[] listOfUserIds = new int[]{1,2,5};
var groups = db.some_table.Where(x => x.isOpen == true)
.Select(t => new Models.XModel() {
Id = t.Id,
Name = t.name,
Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel()
{
Name = user.Name,
UserId = user.UserId
})
});
Now from this groups
list I would like to get the records where there is atleast one user
whose UserId
is within listOfUserIds
.现在,从这个
groups
列表中,我想获取至少有一个UserId
在listOfUserIds
内的user
的listOfUserIds
。
How to achieve this easily without for loop?如何在没有 for 循环的情况下轻松实现这一目标?
Add 1 more condition to your Where
clause:在您的
Where
子句中再添加 1 个条件:
x.Users.Any(user => listOfUserIds.Contains(user.UserId))
Your code:您的代码:
var groups = db.some_table.Where(x => x.isOpen == true && x.Users.Any(user => listOfUserIds.Contains(user.UserId)))
.Select(t => new Models.SomeModel() {
Id = t.Id,
Name = t.name,
Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel()
{
Name = user.Name,
UserId = user.UserId
})
});
To improve performance, you can build a HashSet<int>
:为了提高性能,您可以构建一个
HashSet<int>
:
int[] listOfUserIds = new int[]{1,2,5};
HashSet<int> hash = new HashSet<int>(listOfUserIds);
var groups = db.some_table.Where(x => x.isOpen == true && x.Users.Any(user => hash.Contains(user.UserId)))
.Select(t => new Models.SomeModel() {
Id = t.Id,
Name = t.name,
Users = t.Users.Where(x => x.Age > 25).Select(user => new Models.UsersModel()
{
Name = user.Name,
UserId = user.UserId
})
});
With HashSet<int>
, this operation hash.Contains(x.Id)
is O(1) instead of O(n)
with listOfUserIds
使用
HashSet<int>
,这个操作hash.Contains(x.Id)
是O(1)而不是O(n)
和listOfUserIds
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.