控制Linq发送给db解释的Sql

时间:2017-06-07 11:19:08

标签: c# sql-server linq

您好我有一个为左外连接创建的linq查询。我想知道为什么linq创建它所做的Sql,以及如何使它成为更好的查询。

这是c#查询:

var query=
(
    from subject in subjects
    join statement in statements.DefaultIfEmpty() on subject.Id equals statement.SubjectId
    select subject
);
query.Take(100).Dump();

和它发送的Sql:

SELECT TOP (100) 
--some fields here
FROM [Subject] AS [t0]
INNER JOIN ((
        SELECT NULL AS [EMPTY]
        ) AS [t1]
    LEFT OUTER JOIN [SubjectStatement] AS [t2] ON 1=1 ) ON [t0].[id] = [t2].[SubjectId]

我希望看到的是

SELECT TOP(100)
   --some fields here
FROM Subject
LEFT OUTER JOIN SubjectStatemnt ON Subject.Id = SubjectStatement.Id

有没有办法控制传递给Sql Server的Sql?

1 个答案:

答案 0 :(得分:2)

您正在使用内部联接的语法,虽然这可能会有效,但您通常会使用以下语法创建左联接:

var query =
(
    from subject in subjects
    join statement in statements on subject.Id equals statement.SubjectId into ljStatement
    from statement in ljStatement.DefaultIfEmpty()
    select subject
);
query.Take(100).Dump();

这将导致:

SELECT TOP (100) [t0].[Id]
FROM [Subject] AS [t0]
LEFT OUTER JOIN [SubjectStatement] AS [t1] ON [t0].[Id] = [t1].[SubjectId]


into (C# Reference)

  

into contextual关键字可用于创建临时关键字   用于存储组,join或select子句的结果的标识符   一个新的标识符。

join clause (C# Reference)

  

带有into表达式的join子句称为组连接。

     

...

     

组连接生成分层结果序列,该序列将左源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。小组加入在关系方面没有对应关系;它本质上是一个对象数组序列。   如果找不到右源序列中的元素与左源中的元素匹配,则join子句将为该项生成一个空数组。因此,除了将结果序列组织成组之外,组连接仍然基本上是内部等值连接。