我有一个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);
但这是错误的。甚至无法编译它。写这个的正确方法是什么?
答案 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]))