C# 在LINQ查询中使用'NOT IN'子句

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 )

我已经在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 )

你应该换个方式来做。调用包含对子查询的调用,该子查询中包含多个项:

!(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关键字的投影