sqlsugar in多字段,linq 多字段查询,多对多查询方式 电脑版发表于:2024/3/29 9:58 #### sqlsugar in多字段 版本>=5.1.4.67-preview04 ``` List<OrderItem> list=xxx; db.Queryable<OrderItem>().Where(it => list.Any(s => s.Id == it.Id && s.Name == it.Name)) //也可以用动态表达式拼OR实现 ``` 他生成的sql不是 in (a,b)这种,其实想一下他in的不是一个而是一个集合,所以这种处理成sql也不好处理,写sql的话in一个集合一般里边是一个子查询,是这样的 a,b in (select a,b from users) 。 他生成的sql是一条就是一个and,每条之间用or连接。(a=xx and b=yy) or (a=xx1 and b=yy2)。 #### linq 多字段查询 这里的haveLabTaskResults是一个内存中的集合,多字段查询也是用any,这种在内存中处理的其实很好理解 ``` haveClassAndCourseList = classAndCourseList.Where(a => haveLabTaskResults.Any(i => i.ClassID == a.ClassID && i.CourseId == a.CourseID)).ToList(); ``` #### 多对多查询方式 多对多查询方式其实就应该是用in多字段的方式才对。比如班级与课程是多对多的,班级和课程提交了很多作业,需要查询出来这些班级和课程提交的作业,不能直接and这种组合对了,应该是一条就是一个and,每条之间用or连接才对。 **比如这种先取出来班级与课程集合在去用and连接是不对的** ``` // 班级与课程的集合 var classAndCourseList = classAndCourse.ToList(); // 拿到里边涉及到的课程和班级 List<string> haveCourseIDList = classAndCourseList.Select(a => a.CourseID).Distinct().ToList(); List<string> classIdList = classAndCourseList.Select(a => a.ClassID).Distinct().ToList(); // 找到这些班级和课程提交的作业 var labTaskResults = Db.Queryable<LabTaskResult>().Where((lbt) => classIdList.Contains(lbt.ClassID) && haveCourseIDList.Contains(lbt.CourseID) && lbt.TaskType == 4).ToList(); ``` 这种是不对的,这种组合可能会多出来数据,数据可能会比实际的多,只多不少, **正确的写法应该是一条就是一个and,每条之间用or连接** 不需要先取出来班级和课程的集合,直接用sqlsugar哪个语法去in哪个班级和课程集合即可 ``` // 班级与课程的集合 var classAndCourseList = classAndCourse.ToList(); labTaskResults = Db.Queryable<LabTaskResult>().Where((lbt) => classAndCourseList.Any(s => s.ClassID == lbt.ClassID && s.CourseID == lbt.CourseID) && lbt.TaskType == 4) ```