[英]LINQ: Filter by value in sub list
我已經獲得了這樣的列表:
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
})
});
現在,從這個groups
列表中,我想獲取至少有一個UserId
在listOfUserIds
內的user
的listOfUserIds
。
如何在沒有 for 循環的情況下輕松實現這一目標?
在您的Where
子句中再添加 1 個條件:
x.Users.Any(user => listOfUserIds.Contains(user.UserId))
您的代碼:
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
})
});
為了提高性能,您可以構建一個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
})
});
使用HashSet<int>
,這個操作hash.Contains(x.Id)
是O(1)而不是O(n)
和listOfUserIds
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.