LINQ相当于SQL NOT IN语句

时间:2016-05-26 16:40:38

标签: c# linq

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

2 个答案:

答案 0 :(得分:3)

您可以将包含一起使用。此外,如果您只想计算行数,可以使用计数

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

来自评论:如果您想要全部检索,您仍然可以使用在哪里选择

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或其他一些存储库。

答案 1 :(得分:0)

除非查询类型与要筛选的类型相同(在这种情况下可以使用except),否则没有“not in”运算符。这不是。你正在使用IEnumerable,你想过滤它的ID,所以int列表。 lambda和contains的位置是你最好的选择,并且大多数提供者都会在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();