2011-07-20 20 views
0

次のクエリがあり、それをLINQに変換しています。複数の左結合を持つLINQ where句

select acq.ACQPub as Prev_ACQPub 
    , ve.CompanyID 
     , ve.EntityID 
     , ve.RoundID 
     , ve.EntityName 
     , ve.Date 
     , ve.RoundTypeCode 
     , ve.EventType 
     , ve.PostValue_DJVS 
     , ve.PostVal 
     , ve.PreVal 
     , fin.FinanceStat 
    from ValuationEvents_PIT_New as ve 
    left join Acq_PublicDummy as acq 
    on ve.EntityID = acq.EntityID 
    left join FinStat_New as fin 
    on ve.EntityID = fin.EntityID 
    where ve.EventType in('ACQ','LBO') 
     and acq.ACQPub is null 

私はそれを正しくやったのか、それとも良い方法があるのか​​を再確認したいと思っていました。ここで

は私のコードは次のとおりです。

return (from ve in valuationEvents where ve.EventType == EventTypes.Acq || ve.EventType == EventTypes.Lbo 
          join acq in acqPublicDummies on ve.EntityId equals acq.EntityID into veAcq 
          from x in veAcq.DefaultIfEmpty() where x != null && x.ACQPub == null 
          join fin in finStats on ve.EntityId equals fin.EntityID into veFin 
          from y in veFin.DefaultIfEmpty() 
          select new AcqResearch 
            { PrevAcqPub = x == null ? null : x.ACQPub,           
             EntityId = ve.EntityId, 
             CompanyId = ve.CompanyId, 
             RoundId = ve.RoundId, 
             Date = ve.Date, 
             RoundTypeCode = ve.RoundTypeCode, 
             EventType = ve.EventType.ToString(), 
             PostValueDjvs = ve.PostMoneyValue, 
             PostVal = ve.PostVal, 
             PreVal = ve.PreVal,            
             FinanceStat = y == null ? null : y.FinanceStat 
            }).ToList(); 

結果は、私が代わりにIEnumerableを一覧を返しています> 1回使用されますので。

また、私はSQLを実行することはできませんし、上記のクエリがRawデータに対して実行され、LINQがデータ計算および追加のクレンジングプロセスの後に実行されているため、その結果をLINQ結果と比較できません。したがって、私がLINQ結果と照会結果を比較する方法はありません。私は論理が正しいことに頼る必要があります。同じことは、SQLロジックとLINQロジックです。

ご協力いただきありがとうございます。

+1

greeeeeaaaat – Aducci

+0

@Aducci - ありがとう。 –

答えて

2

に正しく見えます。これを行うためのいくつかの方法があります:

  • SQLプロファイラを使用
  • はLinqPadにクエリを貼り付けた後、SQLタブにすることができますあなたのDataContext

ログオンプロパティを設定し

  • を見ます2つのSQLクエリーを比較し、相違点を確認してください。余談として


    、あなたのケースで、私は変化するであろう唯一のものは、スタイルに関連している - あなたが適用しているものをフィルタ参照する方が簡単ですので、私は、ちょうどselect句以上にwhere句のすべてを移動します。すでにヌルであり、それは(x.ACQPub!= nullのを持っているすべてのxを除外しておりますのでまた、ライン

    PrevAcqPub = x == null ? null : x.ACQPub

    は、同様に

    PrevAcqPub = null

    であってもよいことのように思えますSQLクエリでも同じです)。

  • +0

    ありがとうございます。私はLINQPadについてのあなたの考えが好きですが、SQLタブでそれを表示するには、式を最初に実行する必要があります。私はVSからコードを貼り付けて、それがどのようにSQLに変換されるか見ることはできません。上記の例のように、これは常にオプションではありません。非常に多くのオブジェクトに依存するような大きな表現がある場合、LINQPadに多くのコードを記述する必要があります。 –

    +1

    @Vladクエリの構造をチェックしているだけの場合は、処理されたコレクションをテーブル名で置き換えることができます。 'valuationEvents'を' ValuationEvents_PIT_New'に置き換えてください。また、SQLEXPRESSでいくつかのテーブルをダミーアップ(私はあなたのクエリでこれを行った)し、クエリを実行することができます。しかし、これは理想的ではないことに同意します。SQLProfilerは、場合によってはより簡単なオプションです。 – saus

    +0

    ご協力いただきありがとうございます。 –

    1

    あなたのソリューションを使用すると、クエリが同じであることを確認したい場合は、LINQから生成されたSQLを見ることができます私

    関連する問題