对TestPart模型最后一条数据做条件筛选并获取其Id
解决你的TestPart查询问题
你当前的查询逻辑顺序有问题哦——你是先取了Id最大的那条记录,再去判断它是否符合条件,这会导致如果这条记录不满足筛选要求,就拿不到结果,而不是从所有符合条件的记录里找最后一条。
正确的思路应该是先筛选出所有符合条件的TestPart,再从中取Id最大的那条的Id,下面是调整后的代码:
var lastMatchingId = context.TestPart .Where(tp => tp.TestId == 100 && tp.Status == 1 && tp.Jobs.All(j => j.Type == "Recurring")) .OrderByDescending(tp => tp.Id) .Select(tp => tp.Id) .FirstOrDefault();
代码细节说明:
- Where筛选:先过滤出所有满足要求的记录:TestId等于100、Status等于1,并且关联的所有Jobs的Type都是"Recurring"(
All方法会确保集合里每一个Job都符合Type要求,不会漏掉任何一条不符合的Job) - OrderByDescending排序:把符合条件的记录按Id从大到小排序,这样排在第一位的就是你要的“最后一条”记录
- Select(tp => tp.Id):只选择Id字段,避免加载整个TestPart实体,能有效提升查询性能
- FirstOrDefault():获取排序后的第一条记录的Id,如果没有符合条件的记录,会返回int的默认值0,不会抛出异常(如果确定一定有匹配项,也可以用
First(),但FirstOrDefault()的容错性更强)
这个写法在EF Core 3.0+中会被正确转换成SQL语句,所有筛选和排序都会在数据库端完成,不会占用过多应用端内存。
内容的提问来源于stack exchange,提问作者I Love Stackoverflow
相关产品推荐
相关产品推荐

