C# Linq到Sql左外部联接-筛选空结果
我想将下面的SQL复制到C#LinqToSql中C# Linq到Sql左外部联接-筛选空结果,c#,linq-to-sql,inner-join,C#,Linq To Sql,Inner Join,我想将下面的SQL复制到C#LinqToSql中 SELECT TOP(10) Keywords.* FROM Keywords LEFT OUTER JOIN IgnoreWords ON Keywords.WordID = IgnoreWords.ID WHERE (DomainID = 16673) AND (IgnoreWords.Name IS NULL) ORDER BY [Score] DESC 下面的C#Linq给出了正确的答案。 但我忍不住觉得
SELECT TOP(10) Keywords.*
FROM Keywords
LEFT OUTER JOIN IgnoreWords
ON Keywords.WordID = IgnoreWords.ID
WHERE (DomainID = 16673)
AND (IgnoreWords.Name IS NULL)
ORDER BY [Score] DESC
下面的C#Linq给出了正确的答案。但我忍不住觉得我错过了什么(更好的方法?) 生成的SQL如下所示:
SELECT TOP (10)
[t0].[DomainID]
, [t0].[WordID]
, [t0].[Score]
, [t0].[Count]
FROM [dbo].[Keywords] AS [t0]
LEFT OUTER JOIN
( SELECT 1 AS [test]
, [t1].[ID]
FROM [dbo].[IgnoreWords] AS [t1]
) AS [t2]
ON [t0].[WordID] = [t2].[ID]
WHERE ([t0].[DomainID] = 16673)
AND ([t2].[test] IS NULL)
ORDER BY [t0].[Score] DESC
我怎样才能摆脱这种多余的内部选择?
它只是稍微贵一点,但每一点都有帮助 我认为您可以这样做来消除左连接,或许可以获得更高的效率:
var query = (from keyword in context.Keywords
where keyword.DomainID == ID
&& !(from i in context.IgnoreWords select i.ID).Contains(keyword.WordID)
orderby keyword.Score descending
select keyword)
.Take(10);
NOT IN
和NOT EXISTS
比SQL Server上的LEFT JOIN/IS NULL
效率更高:您是否检查了查询计划以查看它是否有影响?@gabe-是的,阅读本文时存在可测量的差异。似乎非常相关:是的,这是我刚刚找到的答案:)这个答案和问题中的代码都非常直截了当。有人写过一篇文章,将这些方法的基准测试结果发布到彼此的方法中吗?
var query = (from keyword in context.Keywords
where keyword.DomainID == ID
&& !(from i in context.IgnoreWords select i.ID).Contains(keyword.WordID)
orderby keyword.Score descending
select keyword)
.Take(10);