2011-12-30 12 views
1

このLINQクエリは、CRM 2011のクエリセットで使用できます(申し訳ありませんが、長いものです)。現在はデータをプルダウンしていますが、NULLを含むものは含まれていませんNULLの有無にかかわらず。とにかくこのクエリでこれを行う。私はちょっと固まっている。ありがとう!NULLを含むLINQクエリ

更新:NULLを含めるために2つの左結合を含めるようにコードを更新しました。しかし今、私はこのエラーが発生しています:

"'GroupJoin'操作の後に、 'DefaultIfEmpty'メソッドを呼び出す 'SelectMany'操作が続かなければなりません。

エラーを解決する方法はありますか?

var linqQuery = (from r in gServiceContext.CreateQuery("opportunity") 
    join c in gServiceContext.CreateQuery("contact") on ((EntityReference)r["new_contact"]).Id equals c["contactid"] into opp 
    join n in gServiceContext.CreateQuery("annotation") on r["opportunityid"] equals ((EntityReference)n["objectid"]).Id into notes 
    from o in opp.DefaultIfEmpty() 
    from nt in notes.DefaultIfEmpty() 
    where ((EntityReference)r["new_channelpartner"]).Id.Equals(lProfileProperty.PropertyValue) && ((OptionSetValue)r["new_leadstatus"]).Equals("100000002") 

select new 
    { 
       OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"], 
       CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name, 
       Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"], 
       ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name, 
       Source = !r.Contains("new_sourcepick") ? string.Empty : r.FormattedValues["new_sourcepick"], 
       CreatedOn = !r.Contains("createdon") ? string.Empty : ((DateTime)r["createdon"]).ToShortDateString(), 
       CreatedOnSort = !r.Contains("createdon") ? string.Empty : ((DateTime)r["createdon"]).Ticks.ToString(), 
       State = !o.Contains("address1_stateorprovince") ? string.Empty : ((String)o["address1_stateorprovince"]), 
       Zip = !o.Contains("address1_postalcode") ? string.Empty : ((String)o["address1_postalcode"]), 
       Eval = !r.Contains("new_distributorevaluation") || ((OptionSetValue)r["new_distributorevaluation"]).Value.ToString() == "100000000" ? "NA" : r.FormattedValues["new_distributorevaluation"].Substring(0, 2), 
       EvalVal = !r.Contains("new_distributorevaluation") ? "100000000" : ((OptionSetValue)r["new_distributorevaluation"]).Value.ToString(), 
       DistributorName = !r.Contains("new_channelpartner") ? string.Empty : ((EntityReference)r["new_channelpartner"]).Name, 
       ContactStreetAddress = !o.Contains("address1_line1") ? string.Empty : o["address1_line1"], 
       ContactStreetAddress2 = !o.Contains("address1_line2") ? string.Empty : o["address1_line2"], 
       ContactCity = !o.Contains("address1_city") ? string.Empty : o["address1_city"], 
       ContactState = !o.Contains("address1_stateorprovince") ? string.Empty : o["address1_stateorprovince"], 
       ContactZip = !o.Contains("address1_postalcode") ? string.Empty : o["address1_postalcode"], 
       ContactCountry = !o.Contains("address1_country") ? string.Empty : o["address1_country"], 
       ContactPhone = !o.Contains("telephone1") ? string.Empty : o["telephone1"], 
       ContactMobilePhone = !o.Contains("mobilephone") ? string.Empty : o["mobilephone"], 
       ContactEmail = !o.Contains("emailaddress1") ? string.Empty : o["emailaddress1"], 
       Notes = !r.Contains("new_distributornotes") ? string.Empty : r["new_distributornotes"], 
       EstimatedCloseDate = !r.Contains("estimatedclosedate") ? string.Empty : r["estimatedclosedate"], 
       MaturityValue = !r.Contains("estimatedvalue") ? string.Empty : ((Money)r["estimatedvalue"]).Value.ToString(), 
       DistributorStatus = !r.Contains("new_distributorstatuspicklist") ? "Unopened" : r.FormattedValues["new_distributorstatuspicklist"], 
       ColderNotes = !nt.Contains("notetext") ? string.Empty : nt["notetext"], 
       ColderNotesCreatedOn = !nt.Contains("createdon") ? string.Empty : ((DateTime)nt["createdon"]).ToShortDateString(), 
       ColderNotesCreatedBy = !nt.Contains("createdby") ? string.Empty : ((EntityReference)nt["createdby"]).Name, 
}); 
+1

いくつかのテーブルまたはそれらのいずれかにヌルがありますか?どのタイプの結合を行う必要があるかは重要です。 Linqは左の結合をサポートすることができますが、ちょっと怪しいです。 – nycdan

+0

NULLSは、表の注釈と連絡先の両方に入れることができます。ありがとう! –

+0

gServiceContext.CreateQuery( "contact")およびgServiceContext.CreateQuery( "annotation")のNULL値を含める場合は、そうであれば、クエリで使用されているJOINのタイプを変更して、それを試みることができます。 –

答えて

1

両方の結合をLEFT結合に変更する必要があります。あなたの例に従うことができますhere

他の構文がありますが、これはあなたのために動作するはずです。

編集:これは私がこれに使用する構文です(滅菌されているので、何も重要ではないことを願っています)。ちょっと違っていますが、私はそれを扱う方が簡単です。うまくいけば、これは役に立ちます:

 var x = 
      (from A in db.Table1 
      from B in db.Table2 
      .Where(p => p.Table1_ID == A.ID) 
      .DefaultIfEmpty() 
      from C in db.Table3 
      .Where(c => c.Table2_ID == B.ID) 
      .DefaultIfEmpty() 
      where A.field1 == value1 
      select new { [fieldlist] }); 
+0

ありがとうございます。私は上記の例に基づいて上記のクエリを更新しました。私は今このエラーが発生しています。 "'GroupJoin'操作の後に、コレクションセレクタが 'DefaultIfEmpty'メソッドを呼び出す 'SelectMany'操作を続ける必要があります。とにかくそれを修正するために私はそこにいますか? –

+0

私は今、急いでいますが、最初の問題は.DefaultIfEmpty()が2回目の参加の前に来ることです。私が戻ったときに私が見ることができる追加の問題があるかもしれません。 – nycdan

+0

ありがとう、大変感謝しています! –

関連する問題