我有两个表 - “客户”表和“黑名单”客户表。当我将客户列入黑名单时,我将customerid作为外键放入黑名单表。
我想要的是获取不在BlackList表中的CusId和Name。
如何编写此实体框架C#?
Customer
---------
(CusId,Name,Telephone,Email)
Blacklist
---------
(CusId)
答案 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();