简体   繁体   中英

LINQ equivalent of SQL NOT IN statement

I have a query that in T-SQL it is

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)

When I have been converting it to LINQ, I have everything except the "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();

I did temporarily put in this line && ru.Dflt_ste_id != 25

However I need to have AND dflt_ste_id NOT IN (25,346,350,352,353,354,355,357,358,366,372,411)

I am seeing a lot of different code like this lambda where !(list2.Any(item2 => item2.Email == item1.Email))

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

For my linq query, how can I do this Not In in simple manner?

You can use Contains with ! . In addition, if you just want to count rows, you can use 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));

From comment: if you want to retrieve all, you can still use Where and Select .

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

FYI: you cannot call Rpm_scrty_rpm_usrs table class to query. Instead, you need DbContext or some other repository.

There is no "not in" operator unless the type of the query is the same as the type you want to filter against (in which case you could use except). Here it is not. You're working on an IEnumerable and you want to filter on it's ID so a list of int. The where with lambda and contains is your best bet and WILL be translated to an in on the SQL side by most providers.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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