C# Linq到Sql左外部联接-筛选空结果

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给出了正确的答案。 但我忍不住觉得

我想将下面的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给出了正确的答案。
但我忍不住觉得我错过了什么(更好的方法?)

生成的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);