C# LINQ:按子列表中的值筛选
我得到了这样一份清单:C# LINQ:按子列表中的值筛选,c#,linq,C#,Linq,我得到了这样一份清单: 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.
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
})
});
现在,从这个组
列表中,我想获得至少有一个用户
的用户ID
在列表中的记录
如何在没有for循环的情况下轻松实现这一点?在Where
子句中再添加一个条件:
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
})
});
为了提高性能,您可以构建一个哈希集
:
int[]listOfUserIds=newint[]{1,2,5};
HashSet hash=新的HashSet(listofUserId);
var groups=db.some_table.Where(x=>x.isOpen==true&&x.Users.Any(user=>hash.Contains(user.UserId)))
.Select(t=>newmodels.SomeModel(){
Id=t.Id,
Name=t.Name,
Users=t.Users.Where(x=>x.Age>25)。选择(user=>newmodels.UsersModel()
{
Name=user.Name,
UserId=user.UserId
})
});
使用HashSet
,此操作hash.Contains(x.Id)
代替O(n)
使用listOfUserIds
而不使用对于循环,这是不可能的。LINQ includefor
loops意思是没有显式使用for循环,如果有更高的抽象可用,hashset没有push方法,请澄清为什么listofUserId.contains()中有x.Id?它不应该是user.UserId吗?不作为用户工作
将无法在最顶层的位置访问
@shyamal parikh:为什么x
与您的选择中的t
相同。我看到t.Users
在那里<代码>x.Users。任何
都应该有效否x
与t
不同,因为t
继承自model模型。SomeModel
而x
是数据库模型
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
})
});