使用Linq to Entities并带有NOT IN子句

本文关键字:NOT IN 子句 Linq to Entities 使用 | 更新日期: 2023-09-27 18:05:49

我有一个SQL查询,我试图转换为LINQ:

SELECT * FROM TABLE1
WHERE LICENSE_RTK NOT IN(
SELECT KEY_VALUE  FROM TABLE2
WHERE REFERENCE_RTK    = 'FOO')

所以我为内部查询写了一个查询,然后为外部查询写了一个查询,并使用Except:

var insideQuery = (from pkcr in this.Repository.Context.TABLE2 where pkcr.Reference_RTK == "FOO" select pkcr.Key_Value);
var outerQuery = (from pl in this.Repository.Context.TABLE1 select pl).Except(insideQuery);

但这是错误的。甚至不能编译它。正确的写法是什么?

使用Linq to Entities并带有NOT IN子句

不能编译第二个查询,因为应该对相同类型的Queryables使用Except。但是你试着把它应用在Queryable<TABLE1>Queryable<TypeOfTABLE2Key_Value>上。我还认为你应该在这里使用Contains:

var keys = from pkcr in this.Repository.Context.TABLE2 
           where pkcr.Reference_RTK == "FOO" 
           select pkcr.Key_Value;
var query = from pl in this.Repository.Context.TABLE1 
            where !keys.Contains(pl.License_RTK)
            select pl;

注意:生成的查询将是NOT EXISTS而不是NOT IN,但这是你想要的

SELECT * FROM FROM [dbo].[TABLE1] AS [Extent1]
WHERE NOT EXISTS 
    (SELECT 1 AS [C1]
     FROM [dbo].[TABLE2] AS [Extent2]
     WHERE ([Extent2].[Reference_RTK] == @p0) AND 
           ([Extent2].[Key_Value] = [Extent1].[License_RTK]))