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

时间:2014-02-13 22:25:12

标签: c# entity-framework

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

我想要的是获取不在BlackList表中的CusId和Name。

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

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

Blacklist
---------
(CusId)

5 个答案:

答案 0 :(得分:39)

您想要的是以下内容:

db.Customers
    .Where(c => !db.Blacklists
        .Select(b => b.CusId)
        .Contains(c.CusId)
    );

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

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

如果你想测试它并看到它生成的SQL,我强烈推荐LINQPad(它是免费的)。这就是我用来在LINQ中测试一些想法的方法。

答案 1 :(得分:4)

这样的事情怎么样:

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

var result = from c in Customer where !subselect.Contains(c.CusId) select c;

答案 2 :(得分:1)

Any() 是最好的性能:

db.Customers.Where(c => !db.Blacklists.Any(b => b.CusId == c.Id));

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

答案 3 :(得分:0)

如果在表BlackList中,您有一个Customer的列表,您可以执行类似

的操作
 IEnumerable<Customer> model = (from c in db.Customer
                                from b in c.BlackList.DefaultIfEmpty()
                                 where b.CusID== null
                                  select new Customer
                                   {
                                        CusId= c.OrderID
                                    }).ToList();

答案 4 :(得分:0)

我使用过这个查询并且它完美地工作:

var query = _context.Customer.Where(x => x.Id == id && !x.BlackList.Any(z => x.Id == x.CustId)).ToList();