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