【问题标题】:LINQ equivalent of SQL NOT IN statementLINQ 等效于 SQL NOT IN 语句
【发布时间】:2016-05-27 04:10:16
【问题描述】:

我在 T-SQL 中有一个查询

SELECT *                         
  FROM rpm_scrty_rpm_usr ru                                         
WHERE ru.inact_ind = 'N'                       
  AND email_id IS NOT NULL
  AND wwid IS NULL
  AND LTRIM(RTRIM (email_id)) <> ''
  AND dflt_ste_id NOT IN (25,346,350,352,353,354,355,357,358,366,372,411)

当我将它转换为 LINQ 时,除了“NOT IN”之外,我什么都有了

var querynonSystem = (from ru in Rpm_scrty_rpm_usrs
                where ru.Inact_ind == "N" && ru.Email_id != null && ru.Wwid == null && ru.Email_id.Trim() != ""
                && ru.Dflt_ste_id != 25
                select ru).Count();

我确实暂时放了这行&amp;&amp; ru.Dflt_ste_id != 25

但是我需要AND dflt_ste_id NOT IN (25,346,350,352,353,354,355,357,358,366,372,411)

我看到很多不同的代码,比如 这个 lambda where !(list2.Any(item2 =&gt; item2.Email == item1.Email))

然后var otherObjects = context.ItemList.Where(x =&gt; !itemIds.Contains(x.Id));

对于我的 linq 查询,我怎样才能以简单的方式做到这一点 Not In

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以将 包含! 一起使用。另外,如果只想统计行数,可以使用Count

    var ids = new List<int> {25, 346, 350, 352, 353, 354, 355, 357, 358, 366, 372, 411};
    
    var querynonSystem = XXXcontext.Rpm_scrty_rpm_usrs.Count(x => 
       x.Inact_ind == "N" &&
       x.Email_id != null &&
       x.Wwid == null &&
       x.Email_id.Trim() != "" &&
       !ids.Contains(x.Dflt_ste_id));
    

    来自评论:如果你想检索全部,你仍然可以使用WhereSelect

    var querynonSystem = XXXcontext.Rpm_scrty_rpm_usrs.Where(x => 
       x.Inact_ind == "N" &&
       x.Email_id != null &&
       x.Wwid == null &&
       x.Email_id.Trim() != "" &&
       !ids.Contains(x.Dflt_ste_id)).Select(x => x).ToList();
    

    仅供参考:您不能调用 Rpm_scrty_rpm_usrs 表类进行查询。相反,您需要 DbContext 或其他一些存储库。

    【讨论】:

    • 我可能也想使用 .ToList() 仅供参考,很可能我会或不会,然后创建其他过滤,如 var querynonSystemCount = querynonSystem.Count();
    • 我先在 Linqpad 中做,它连接到 sql server,然后我放入 Visual Studio 所以 Rpm_scrty_rpm_usrs = db.rpm_usr ( db 是上下文,而 rpm_usr 是基于 dbset 的属性poco ....)
    • 太棒了!因此,如果我有另一个要包含的查询,而不是 NOT IN (....) 我想要来自 !ids.ContainsIN( .... ) I would do same but remove !` 以便它是 ids.Contains 对吗?
    • 正确。包含用于 IN 和 !Contain 用于 NOT IN
    • 公共整数? dflt_ste_id { 得到;放; } 导致问题
    【解决方案2】:

    没有“not in”运算符,除非查询的类型与您要过滤的类型相同(在这种情况下,您可以使用 except)。这里不是。您正在处理一个 IEnumerable 并且您想过滤它的 ID,所以一个 int 列表。带有 lambda 和 contains 的 where 是您最好的选择,大多数提供商将在 SQL 端将其转换为 in。

    var FilterIds = new List<int>{1,2,3,4,344,3423525};
    
    var querynonSystem = (from ru in Rpm_scrty_rpm_usrs
                where ru.Inact_ind == "N" && ru.Email_id != null && ru.Wwid == null && ru.Email_id.Trim() != ""
                && ru.Dflt_ste_id != 25
                select ru)
                // Use this
                .Where(ru=>!FilterIds.Any(id=>ru.dflt_ste_id ==id))                
                // Or this
                .Where(ru=>!FilterIds.Contains(ru.dflt_ste_id))
                .Count();
    

    【讨论】:

    • .Where(ru=>!FilterIds.Contains(id=>ru.dflt_ste_id ==id)) ?
    • 无法将 lambda 表达式转换为类型“int”,因为它不是委托类型
    • @JeremyMiller 抱歉,要么更改包含,要么保留包含,并且只将 ru.dfit_ste_id 传递给它而不是 lambda
    • @JeremyMiller 修正了我的答案以说明它
    • 嘿,我如何添加一个 Join ,我收到错误。Join(Rpm_scrty_emp_info, z => z.Wwid, ei => ei.Wwid, (z, ei) => new{ z,ei}) .Where(z => z.Inact_ind == "N" && z.Wwid != null)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2010-10-28
    相关资源
    最近更新 更多