选择Entity Framework中另一个表中不存在的记录

Day*_*ker 21 c# entity-framework

我有两个表 - "客户"表和"黑名单"客户表.当我将客户列入黑名单时,我将customerid作为外键放入Blacklist表.

我想要的是获得不在BlackList表中的CusId和Name.

我如何编写此实体框架C#?

Customer
---------
(CusId,Name,Telephone,Email)

Blacklist
---------
(CusId)
Run Code Online (Sandbox Code Playgroud)

Tim*_*ers 43

你想要的是如下:

db.Customers
    .Where(c => !db.Blacklists
        .Select(b => b.CusId)
        .Contains(c.CusId)
    );
Run Code Online (Sandbox Code Playgroud)

EF很乐意将其变成一个运行良好的子查询.

此模式适用于静态列表(创建IN(a, b, c)表达式)以及其他表.您可以使用它来检查是否列在列表中.

如果你想测试它并看到它生成的SQL,我强烈推荐LINQPad(它是免费的).这就是我用来测试LINQ中的小想法的原因.

  • 非常慢:如果“黑名单”表有100万条记录,它将无法正常工作,因为它总是会给出超时错误 (3认同)
  • 较短版本:`db.Customers.Where(c=>!db.Blacklists.Any(b=>b.CusId==c.CusId))`。但是,实体框架将生成相同的 SQL 表达式。 (3认同)

小智 6

这样的事情怎么样:

var subselect = (from b in BlackList select b.CusId).ToList();

var result = from c in Customer where !subselect.Contains(c.CusId) select c;
Run Code Online (Sandbox Code Playgroud)


M K*_*aei 5

Any() 是最好的性能:

db.Customers.Where(c => !db.Blacklists.Any(b => b.CusId == c.Id));
Run Code Online (Sandbox Code Playgroud)

如果您还需要黑名单,请使用条件连接:b.CusId == c.Id