2014-02-13 31 views
14

我有两个表 - “客户”表和“黑名单”客户表。当我将客户列入黑名单时,我将customerid作为黑名单表的外键。选择实体框架中其他表中不存在的记录

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

我该如何编写这个实体框架C#?

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

Blacklist 
--------- 
(CusId) 
+0

我新的EF执行的东西,我高压已经尝试过variours方式。他们都没有工作。所以请帮我解决这个问题。 – Daybreaker

回答

24

你想要的是类似以下内容:

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

EF会很乐意把它转换成一个子查询将运行得非常好。

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

如果你想测试它并看到它生成的SQL,我强烈推荐LINQPad(它是免费的)。这正是我用来在LINQ中始终测试一些小创意的原因。

+0

你可以提供一个“详细”的版本(如下面Tim提供的答案)吗?那真的会有帮助。或者如果你知道一个地方从一个转换到另一个会更好:) – MaxOvrdrv

+0

如何添加另一个Where子句?例如Where Customer.Email =='[email protected]'? – Diego

3

怎么是这样的:

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

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

你有什么理由要这样做,而不是提摩西分享的方式吗? –

+0

@PeterMajeed好吧,我不确定,但Tim只拿到一次BlackList。 Timothys BlackList被封装在一个Where中(但它可能是EF优化的,所以它只能被一次获取) – Default

+1

我做了一个快速检查,结果表明,对于我的代码,BlackList表被添加为WHERE不存在(SELECT NULL作为[Empty] FROM [Blacklist] ...'所以它甚至没有检索它,SQL完成所有工作并且它被很好地优化了 –

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(); 
相关问题