繁体   English   中英

LINQ等效于SQL NOT IN语句

[英]LINQ equivalent of SQL NOT IN statement

我有一个查询,在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();

我确实把这行临时放在&& 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 => item2.Email == item1.Email))

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

对于我的linq查询,如何Not In简单的方式做到这一点?

您可以将Contains 另外,如果只想对行进行计数,则可以使用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或其他某个存储库。

除非查询的类型与要过滤的类型相同(在这种情况下,可以使用除外),否则没有“ not in”运算符。 这里不是。 您正在使用IEnumerable,并且想对其ID进行筛选,以便获取int列表。 使用lambda和contains的位置是最好的选择,大多数提供程序都会将其转换为SQL方面的信息。

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM