我有两个表 - “客户”表和“黑名单”客户表。当我将客户列入黑名单时,我将customerid作为黑名单表的外键。选择实体框架中其他表中不存在的记录
我想要的是获取不在BlackList表中的CusId和Name。
我该如何编写这个实体框架C#?
Customer
---------
(CusId,Name,Telephone,Email)
Blacklist
---------
(CusId)
我有两个表 - “客户”表和“黑名单”客户表。当我将客户列入黑名单时,我将customerid作为黑名单表的外键。选择实体框架中其他表中不存在的记录
我想要的是获取不在BlackList表中的CusId和Name。
我该如何编写这个实体框架C#?
Customer
---------
(CusId,Name,Telephone,Email)
Blacklist
---------
(CusId)
你想要的是类似以下内容:
db.Customers
.Where(c => !db.Blacklists
.Select(b => b.CusId)
.Contains(c.CusId)
);
EF会很乐意把它转换成一个子查询将运行得非常好。
此模式适用于静态列表(创建IN(a, b, c)
表达式)以及其他表。您可以使用它来检查是否在列表中或不在列表中。
如果你想测试它并看到它生成的SQL,我强烈推荐LINQPad(它是免费的)。这正是我用来在LINQ中始终测试一些小创意的原因。
怎么是这样的:
var subselect = (from b in BlackList select b.CusId).ToList();
var result = from c in Customer where !subselect.Contains(c.CusId) select c;
你有什么理由要这样做,而不是提摩西分享的方式吗? –
@PeterMajeed好吧,我不确定,但Tim只拿到一次BlackList。 Timothys BlackList被封装在一个Where中(但它可能是EF优化的,所以它只能被一次获取) – Default
我做了一个快速检查,结果表明,对于我的代码,BlackList表被添加为WHERE不存在(SELECT NULL作为[Empty] FROM [Blacklist] ...'所以它甚至没有检索它,SQL完成所有工作并且它被很好地优化了 –
如果按表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();
我新的EF执行的东西,我高压已经尝试过variours方式。他们都没有工作。所以请帮我解决这个问题。 – Daybreaker