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

假设这两个简化表:

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

leoyyc1987 回答:LINQ和EF核心构建查询为“不在” TableOne TableTwo

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3131999.html

大家都在问