LINQ Query with NULL - PullRequest
       4

LINQ Query with NULL

1 голос
/ 30 декабря 2011

У меня есть этот запрос LINQ (извините, он длинный), который задает запрос из CRM 2011. Сейчас он обрабатывает данные, но не включает в себя те, которые имеют значения NULL. Я хочу, чтобы он обрабатывал те, с которыми и без нулей. В любом случае, сделать это с помощью этого запроса. Я вроде застрял. Спасибо!

Обновление: я обновил код, включив в него два левых соединения, чтобы включить NULL. Но теперь я получаю эту ошибку:

«За операцией« GroupJoin »должна следовать операция« SelectMany », когда селектор коллекций вызывает метод« DefaultIfEmpty »."

Есть идеи как исправить ошибку?

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 Ответ

1 голос
/ 30 декабря 2011

Вам нужно изменить оба ваших соединения на ЛЕВЫЕ. Вы можете следовать примеру здесь

Существуют другие синтаксисы, но это должно работать для вас.

Редактировать: вот синтаксис, который я использую для этого (стерилизованный, так что я надеюсь, что не сломал ничего важного). Это немного по-другому, но мне легче работать. Надеюсь, это поможет:

        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] });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...