假设这两个简化表:
public int OneId { get; set; }
public ICollection<TableTwo> TableTwo { get; set; }
带有值
OneId
1
2
3
public int OneId { get; set; }
public string Color {get; set; }
public int AnotherId {get; set; }
public TableOne TableOne { get; set; }
带有值
OneId | Color | AnotherId
1 | Blue | 9
1 | Green | 1
2 | Blue | 1
我想得到的是所有TableOne
都没有标记为Blue
和AnotherId != 9
的东西。
我可以通过一个贫穷的男人完成2步。首先得到我想要的相反的东西:
var firstStep = await TableOne
.AsNoTracking()
.Where(o => o.TableTwo.Any(t => t.Color == "Blue" && t.AnotherId == '9'))
.Select(o => o.OneId)
.ToListAsync();
哪位给了我List<int>
,我可以这样做:
var secondStep = from a in TableOne
where !firstStep.Contains(a.OneId)
select a;
var finalResult = await secondStep.ToListAsync();
这将正确返回我要查找的内容:
OneId
2
3
1
是唯一不符合条件的人,因为他是唯一用Blue
和9
标记的人。
我不喜欢这种方法是.Contains
生成的SQL。
SELECT `a`.`OneId`
FROM `TableOne` AS `a`
WHERE `a`.`OneId` NOT IN (1)
NOT IN
部分可能具有数千个值,并且未对结果查询进行参数化,从而使CPU不满意。
如何将其设置为NOT EXISTS
而不是NOT IN
?