排名
6
文章
199
粉丝
4
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术

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)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价