2011-12-30 4 views
1

J'ai cette requête LINQ (désolé, c'est long) que les ensembles de requêtes de CRM 2011. En ce moment, il tire vers le bas des données, mais il n'inclut pas celles avec des valeurs NULL je veux qu'il baisse ceux avec et sans NULL. Quoi qu'il en soit pour le faire avec cette requête. Je suis coincé. Merci!Requête LINQ avec NULL

Mise à jour: j'ai mis à jour le code pour inclure les deux jointures à gauche pour inclure les valeurs NULL. Mais maintenant j'obtiens cette erreur:

"L'opération 'GroupJoin' doit être suivie par une opération 'SelectMany' où le sélecteur de collection appelle la méthode 'DefaultIfEmpty'."

Des idées sur la façon de corriger l'erreur?

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

Est-ce que les nulls seulement dans certaines des tables ou l'un d'eux? Il importe de savoir quel type de jointure vous devez faire. Linq peut supporter les jointures à gauche bien que ce soit un peu bancal. – nycdan

+0

NULLS peut figurer dans les deux tableaux, annotation et contacts. Merci! –

+0

Vous souhaitez inclure les valeurs NULL gServiceContext.CreateQuery ("contact") et gServiceContext.CreateQuery ("annotation")? Si c'est le cas, vous pouvez essayer de le faire en changeant le type de JOIN utilisé dans la requête. –

Répondre

1

Vous devrez modifier vos deux jointures en jointures GAUCHE. Vous pouvez suivre l'exemple here

Il existe d'autres syntaxes, mais cela devrait fonctionner pour vous. Edit: Voici la syntaxe que j'utilise pour cela (stérilisée donc j'espère que je n'ai rien cassé d'important). C'est un peu différent, mais je trouve qu'il est plus facile de travailler avec. Espérons que cela va aider:

 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

Merci. J'ai mis à jour ma requête ci-dessus sur la base de l'exemple. Je reçois cette erreur maintenant. "L'opération" GroupJoin "doit être suivie par une opération" SelectMany "dans laquelle le sélecteur de collection appelle la méthode" DefaultIfEmpty "." Je là de toute façon pour résoudre ce problème? –

+0

Je me dépêche maintenant, mais je suis sûr qu'un problème est le premier .DefaultIfEmpty() vient avant la deuxième jointure. Il peut y avoir un problème supplémentaire que je peux regarder quand je reviens. – nycdan

+0

Merci beaucoup! –