在LINQ中实现“not in”(又名“not exists”)逻辑

时间:2012-06-04 17:07:35

标签: c# linq linq-to-objects

设置

  1. 我有两个List<T>
  2. 数据未标准化,来自不同来源,这解释了所需逻辑中的卷积
  3. 数据中的非正式复合键是fieldA,fieldB,fieldC。
  4. “fields”是字符串 - 引用类型 - 因此它们的值可以为null。我想删除它们可能匹配null的记录。我得到C#中的空引用将匹配,但在SQL中它们不匹配。添加!string.IsNullOrEmpty()非常简单。
  5. 这不是关于数据库设计或关系代数的问题。
  6. 我有其他逻辑涵盖其他标准。不建议减少显示的逻辑,以便扩大结果集。见上面的#5。
  7. 问题

    我想根据非正式密钥找到listA中不在listB中的记录。然后,我想根据部分密钥匹配进一步细化listA结果。

    问题的SQL版本:

    select 
        listA.fieldA, listA.fieldB, matching.fieldC  
     from listA
     left join listB keyList on 
          listA.fieldA = keyList.fieldA and
          listA.fieldB = keyList.fieldB and
          listA.fieldC = keyList.fieldC
     inner join listB matching on
          listA.fieldA = matching.fieldA and
          listA.fieldB = matching.fieldB 
     where
        keyList.fieldA is null  
    

1 个答案:

答案 0 :(得分:2)

SQL to LINQ ( Case 7 - Filter data by using IN and NOT IN clause)

注意: IN和NOT IN在LINQ查询中使用相同的函数,但它只是使用了! (不)符号。这是图形表示:

enter image description here

您使用where <list>.Contains( <item> )

var myProducts = from p in db.Products
                 where productList.Contains(p.ProductID)
                 select p;

或者您可以预定义列表:

var ids = {1, 2, 3};

var query = from item in context.items
            where ids.Contains( item.id )
            select item;

对于&#39; NOT&#39;案例,只需添加&#39;!&#39;在&#39;包含&#39;之前的运算符言。