[英]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));
来自评论:如果要检索所有内容,仍可以使用Where和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();
仅供参考: 您无法调用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.