簡體   English   中英

選擇實體框架中另一個表中不存在的記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM