C# 在LINQ查询中使用'NOT IN'子句
我已经在LINQPad中测试了以下LINQ查询。但它给了我一个错误: 编译表达式时出错:编译表达式时出错:“string.Containsstring”的最佳重载方法匹配具有一些无效参数 参数“1”:无法从“System.Linq.IQueryable”转换为“string” 实际上,在SQL查询中,以下是我需要的:C# 在LINQ查询中使用'NOT IN'子句,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我已经在LINQPad中测试了以下LINQ查询。但它给了我一个错误: 编译表达式时出错:编译表达式时出错:“string.Containsstring”的最佳重载方法匹配具有一些无效参数 参数“1”:无法从“System.Linq.IQueryable”转换为“string” 实际上,在SQL查询中,以下是我需要的: WHERE ASN_ITEM.AWB_NO NOT IN (SELECT DISTINCT AWB_NO FROM ASN_ITEM WHERE SCAN_STAT !=2 )
WHERE ASN_ITEM.AWB_NO NOT IN (SELECT DISTINCT AWB_NO FROM ASN_ITEM WHERE SCAN_STAT !=2 )
你应该换个方式来做。调用包含对子查询的调用,该子查询中包含多个项:
!(from t2 in db.ASN_ITEM
where t2.SCAN_STAT != 2
select t2.AWB_NO
).Distinct()
.Contains(t.AWB_NO)
此外,您必须直接选择AWB_NO,如上所示,而不是投影到匿名类型。执行后一种操作将防止使用Contains,因为集合中的项类型将不同于作为Contains参数传递的对象类型。您应该以另一种方式执行此操作。调用包含对子查询的调用,该子查询中包含多个项:
!(from t2 in db.ASN_ITEM
where t2.SCAN_STAT != 2
select t2.AWB_NO
).Distinct()
.Contains(t.AWB_NO)
此外,您必须直接选择AWB_NO,如上所示,而不是投影到匿名类型。执行后者将防止使用Contains,因为集合中的项类型将不同于作为Contains参数传递的对象类型。从您的代码中,我推断AWB_NO是一个字符串。如果是,那么你在这里做什么:
!t.AWB_NO.Contains((from t2 in db.ASN_ITEM
where
t2.SCAN_STAT != 2
select new {
t2.AWB_NO
}).Distinct())
翻译成这样:字符串ABW_NO contains和它的contains不是真的,不是一个具有一个字符串属性的匿名类型的一些不同元素的表。这毫无意义。这不是一个不在查询中的问题。您正在检查单个字符串是否包含一组匿名类型对象
如果要使用String.Contains并检查某个字符串是否包含另一个字符串,则这将更有意义,但可能不是您想要的:
!t.AWB_NO.Contains((from t2 in db.ASN_ITEM
where
t2.SCAN_STAT != 2
select t2.AWB_NO).FirstOrDefault())
您可能会发现以下内容很有帮助:
从您的代码中,我推断AWB_NO是一个字符串。如果是,那么你在这里做什么:
!t.AWB_NO.Contains((from t2 in db.ASN_ITEM
where
t2.SCAN_STAT != 2
select new {
t2.AWB_NO
}).Distinct())
翻译成这样:字符串ABW_NO contains和它的contains不是真的,不是一个具有一个字符串属性的匿名类型的一些不同元素的表。这毫无意义。这不是一个不在查询中的问题。您正在检查单个字符串是否包含一组匿名类型对象
如果要使用String.Contains并检查某个字符串是否包含另一个字符串,则这将更有意义,但可能不是您想要的:
!t.AWB_NO.Contains((from t2 in db.ASN_ITEM
where
t2.SCAN_STAT != 2
select t2.AWB_NO).FirstOrDefault())
您可能会发现以下内容很有帮助:
我认为这是因为您选择的新{…}中包含。。。创建新的匿名类型。您必须将其解析为字符串或创建新字符串{…}。假设t2.AWB_NO是一个字符串,您可以使用select t2.AWB_NO而不是使用带有新关键字的投影。我认为这是因为select new{…}中包含。。。创建新的匿名类型。您必须将其解析为字符串或创建新字符串{…}。假设t2.AWB_NO是一个字符串,您可以只使用select t2.AWB_NO,而不使用带有new关键字的投影