2017-06-07 4 views
1

こんにちは私は左外部結合のために作成したlinqクエリを持っています。私はlinqがSqlを作成する理由と、それをより良いクエリにする方法が不思議です。Linqがdbの説明に送る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を制御しますか?

答えて

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] 
文脈KEYWに


into (C# Reference)

ordを使用して、 という一時的な識別子を作成し、グループ、ジョイン、またはselect句の結果を新しい識別子 に格納することができます。

join clause (C# Reference)

A発現にグループ参加と呼ばれるで句を結合します。

...

基が右側ソースシーケンス内の1つまたは複数の整合素子と左ソースシーケンスの要素を関連付ける階層結果シーケンスを生成参加します。グループ結合には、リレーショナル用語で同等のものはありません。基本的にオブジェクト配列のシーケンスです。 右側のソースシーケンスの要素が左側のソースの要素と一致するものが見つからない場合、join句はその項目の空の配列を生成します。したがって、グループ結合は、結果シーケンスがグループに編成されていることを除いて、基本的には内部equijoinです。

+0

ありがとうございました!なぜこれが必要なのか説明できますか? – JT1979

+0

追加されたリンクを確認してください。具体的には、join節がそれについて少し説明します。 – Silvermind

関連する問題