[英]Select records that does not exist in another table in Entity Framework
我有兩個表 - “客戶”表和“黑名單”客戶表。 當我將客戶列入黑名單時,我將 customerid 作為外鍵添加到 Blacklist 表中。
我想要的是獲取不在 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;
如果在表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();
Any() 是最好的性能:
db.Customers.Where(c => !db.Blacklists.Any(b => b.CusId == c.Id));
如果您還需要黑名單列,使用與加盟條件:b.CusId == c.Id
我使用了這個查詢,它完美地工作:
var query = _context.Customer.Where(x => x.Id == id && !x.BlackList.Any(z => x.Id == x.CustId)).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.