Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ:按子列表中的值筛选_C#_Linq - Fatal编程技术网

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 include
for
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
                                })
                            });