簡體   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