LINQ和EF核心构建查询为“不在”

时间:2019-11-09 17:04:14

标签: c# linq ef-core-3.0

假设这两个简化表:

TableOne

public int OneId { get; set; }
public ICollection<TableTwo> TableTwo { get; set; }

带有值

OneId
1
2
3

TableTwo

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都没有标记为BlueAnotherId != 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是唯一不符合条件的人,因为他是唯一用Blue9标记的人。

我不喜欢这种方法是.Contains生成的SQL。

SELECT `a`.`OneId`
FROM `TableOne` AS `a`
WHERE `a`.`OneId` NOT IN (1)

NOT IN部分可能具有数千个值,并且未对结果查询进行参数化,从而使CPU不满意。

如何将其设置为NOT EXISTS而不是NOT IN

0 个答案:

没有答案