c# - 带有“包含”和列表的 Linq 查询过滤器多个属性
问题描述
我正在使用实体框架和点网框架
例如,我有学生课
public class Student
{
public int StudentId { get; set; }
public int Age { get; set; }
public int DepartmentId { get; set; }
public string Name { get; set; }
}
当我需要搜索许多部门的学生时,我可以这样做
List<Student> students = new List<Student>
{
new Student{Age = 12,DepartmentId =1 },
new Student{Age = 11,DepartmentId =2 },
new Student{Age = 11,DepartmentId =3 },
new Student{Age = 13,DepartmentId =4 },
};
// get all department ids
var departmentIds = students.Select(s => s.DepartmentId);
var studentList = DbContext.Students.Where(s=>departmentIds.Contains(s.DepartmentId)).ToList();
这将生成 SQL 查询,如
Select StudentId , Age , DepartmentId , Name
From Students where DepartmentId in (1 , 2 , 3 , 4)
我的问题
我需要搜索任何学生匹配学生列表中的任何项目,如以下查询
Select StudentId , Age , DepartmentId , Name
From students
Where
(departmentId= 1 and age = 12)
OR
(departmentId= 2 and age = 11)
OR
(departmentId= 3 and age = 12)
OR
(departmentId= 4 and age = 13)
解决方案
存储每个部门的年龄并写入
var departmentAge =
departments.ToDictionary(d => d.DepartmentId, d => d.RequiredAge);
接着
.Where(s => departmentIds.Contains(s.DepartmentId) &&
s.Age == departmentAge[s.DepartmentId])
第二部分不能翻译成 SQL。您可能必须将它与AsEnumerable
查询中的两个表分开或连接以获得类似
Select s.StudentId, s.Age, s.DepartmentId, s.Name
From Students s inner join Departments d
where s.DepartmentId in (1 , 2 , 3 , 4) and s.Age = d.RequiredAge
推荐阅读
- r - 有没有办法告诉 R 假设您正在从特定数据帧中提取子集?
- swift - 如何使用 Swift 根据 textview 的大小实时扩展 uicollectionviewcell?
- go - 如何切片切片以消除相同切片中的匹配值
- prolog - 在 Prolog 中生成具有自变量的列表
- c++ - CMake“未定义的参考”
- python - 使用 selenium python 切换到新窗口
- spring - Spring批处理文件读取器记录在记录中具有不同的分隔符
- rest - Express REST API 路由器和 Mongoose 模式设计
- events - 如何从存储在主结构中的回调调用 self 函数?
- pdf-generation - 无法访问 zabbix pdf 生成器