2011-07-22 7 views
2

次のSQL文をLINQに変換する方法はありますか?複数のSQL LEFT JOIN文をLINQに変換する方法

select ve.EntityID 
     , fin1.FinanceStat as FinanceStat_New 
     , fin2.FinanceStat as FinanceStat_Old 
    from ValuationEvents_PIT_New as ve 
    left join FinStat_New as Fin1 
    on ve.EntityID = Fin1.EntityID 
    left join FinStat_Old as Fin2 
    on ve.EntityID = Fin2.EntityID 
    where Fin1.FinanceStat ne Fin2.FinanceStat 
     and Fin2.FinanceStat is not null 
     and charindex(Fin1.FinanceStat, 'abc') < 1 
     and charindex(Fin1.FinanceStat, 'xyz') < 1 

ここに私のバージョンですが、私はそれを見るために余分なペアが必要です。なぜならCHARINDEX(Fin1.FinanceStat、 'ABC')x.FinStatNew1がnullと 'ABC' でない場合は、常に0を返します< 1、の

var result = (from ve in valuationEventsPit 
     join fsn in finStatNew on ve.EntityId equals fsn.EntityID into veFsn 
     from fin1 in veFsn.DefaultIfEmpty() 
     join fso in finStatOld on ve.EntityId equals fso.EntityID into veFso 
     from fin2 in veFso.DefaultIfEmpty() 
     select new 
     { 
      ve.EntityId, 
      FinStatNew1 = fin1 == null ? null : fin1.FinanceStat, 
      FinStatNew2 = fin2 == null ? null : fin2.FinanceStat 
     }). 
     Where(x => x.FinStatNew1 != null && 
      x.FinStatNew2 != null && 
      x.FinStatNew1 != x.FinStatNew2 && 
      !(x.FinStatNew1.Contains("abc")) && 
      !(x.FinStatNew1.Contains("xyz"))).ToList(); 

私はx.FinStatNew1を除く午前理由== nullをまたは 'xyz'が存在せず、x.FinStatNew1がnullの場合はnullを返し、条件はfalse(null < 0)になります。

ありがとうございました。

答えて

2

私はあなたがそのクエリをさらに減らして、読みやすくするためにいくつかのものを再配置できると思います。元のクエリに基づいており、これらはオブジェクトクエリに実際にLINQあり、私はこれを試してみた:

const string con1 = "abc"; 
const string con2 = "xyz"; 
var query = 
    from ve in valuationEventPit 
    join fsn in finStatNew on ve.EntityId equals fsn.EntityID 
    join fso in finStatOld on ve.EntityId equals fso.EntityID 
    let FinStatNew = fsn.FinanceStat 
    let FinStatOld = fso.FinanceStat 
    where FinStatNew != FinStatOld && FinStatOld != null 
     && new[]{con1,con2}.All(con => !FinStatNew.Contains(con)) 
    select new { ve.EntityId, FinStatNew, FinStatOld }; 

左はここでは必要ではありません参加します。ヌル値を除外しているので、それらを無視して内部結合を行うだけです。

+0

ありがとうございます。これはLINQ to SQLまたはEFではなく、これはLINQ to Objectsであり、nullをチェックする必要があります。それ以外の場合はNullReferenceExceptionが発生します。 –

+0

ああ、その場合、私たちがここでやることができるより多くのことがあります。私は更新します。 –

+0

もう一度ありがとうございます。私はあなたが今この方法でそれをしたので、あなたが今Inner Joinを使用しているのを見ます。私の翻訳が正しいかどうかわからない、そうでなければ私は助言を求めないだろう:)。左結合を使用していても、私が持っているクエリが内部結合を実行しているとはまだ信じていますか?私のコードの代わりにオリジナルのSQLを読んでください。 –