2011-11-10 7 views
2

私は、単一のLINQの式にこれをダウントレースしてきました..私は継承されたウェブアプリでいくつかの既存のコードでクラッシュを追跡しようとしている:エラーは、シーケンスに要素が含まれていない」であるアイテムが見つからない場合、LINQ式はLEFT JOINを使用できますか?

var projInfo = (from v in context.TPM_PROJECTVERSION 
       join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID 
       join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID 
       join pt in context.TPM_PROJECTTYPES on p.PROJECTTYPEID equals pt.PROJECTTYPEID 
       where v.PROJECTID == projectId && v.VERSIONID == versionId 
       select new 
       { 
        ProjectName = v.NAME, 
        ProjectType = pt.SHORTNAME, 
        ProjectDesc = v.DESCRIPTION, 
        BusinessLaunchData = p.BUSINESSLAUNCHDATE, 
        BusinessSponsor = (v.TPM_USER3.FIRSTNAME + " " + v.TPM_USER3.LASTNAME), 
        PrimaryTrainingOwner = (pto.FIRSTNAME + " " + pto.LASTNAME) 
       }).First(); 

"これは私がこの行にたどった:

join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID 

USER1がnullの場合、行は返されません。代わりに、私はPrimaryTrainingOwnerをnullまたは空白にする必要があります。基本的には、代わりにLEFT JOINを実行し、PrimaryTrainerOwnerを設定する際にこれをチェックする必要があります。このケースを処理するためにこのLINQ式を更新する方法はありますか?ありがとう!

答えて

1

解決策が見つかりました。私はこれが最善のアプローチであるか構文であるかに関係なく、何かコメントをいただければ幸いです。ありがとう!

var projInfo = (from v in context.TPM_PROJECTVERSION 
       join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID 
       join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID into primaryowner 
       from subpto in primaryowner.DefaultIfEmpty() 
       join pt in context.TPM_PROJECTTYPES on p.PROJECTTYPEID equals pt.PROJECTTYPEID 
       where v.PROJECTID == projectId && v.VERSIONID == versionId 
       select new 
       { 
        ProjectName = v.NAME, 
        ProjectType = pt.SHORTNAME, 
        ProjectDesc = v.DESCRIPTION, 
        BusinessLaunchData = p.BUSINESSLAUNCHDATE, 
        BusinessSponsor = (v.TPM_USER3.FIRSTNAME + " " + v.TPM_USER3.LASTNAME), 
        PrimaryTrainingOwner = subpto == null ? String.Empty : (subpto.FIRSTNAME + " " + subpto.LASTNAME) 
       }).First(); 
+1

これはまさに正しいことです。 'subpto'ではなく' pto'を再利用するという選択肢があります。これは、元の 'pto'値が範囲外であるためです。 – dahlbyk

関連する問題