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

时间:2014-05-28 17:50:00

标签: c# linq linq-to-entities

我有一个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);

但这是错误的。甚至无法编译它。写这个的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您无法编译第二个查询,因为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]))