Ошибка LINQ при использовании DefaultIfEmpty - PullRequest
3 голосов
/ 27 августа 2011

Я пытаюсь сбросить NULLS контактов, и я использую DefaultIfEmpty, чтобы сделать это. Но я получаю эту ошибку.

"Метод 'GroupJoin' не может следовать за методом 'Join' или не поддерживается. Попробуйте написать запрос в терминах поддерживаемых методов или вызвать метод 'AsEnumerable' или 'ToList' перед вызовом неподдерживаемых методов."

Я использую поставщика LINQ-to-CRM и запрашиваю его из веб-службы CRM 2011.

Это код, который я использую:

var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")
         join a in orgServiceContext.CreateQuery("account") on ((EntityReference)r["accountid"]).Id equals a["accountid"]
         join c in orgServiceContext.CreateQuery("contact") on ((EntityReference)r["new_contact"]).Id equals c["contactid"]
         where ((EntityReference)r["new_channelpartner"]).Id.Equals(new Guid("c55c2e09-a3be-e011-8b2e-00505691002b"))
         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_source") ? string.Empty : r["new_source"],
           CreatedOn = !r.Contains("createdon") ? string.Empty : r["createdon"],
           State = !a.Contains("address1_stateorprovince") ? string.Empty : a["address1_stateorprovince"],
           Zip = !a.Contains("address1_postalcode") ? string.Empty : a["address1_postalcode"],
           Eval = !r.Contains("new_colderevaluation") ? string.Empty : r.FormattedValues["new_colderevaluation"],
           DistributorName = !r.Contains("new_channelpartner") ? string.Empty : ((EntityReference)r["new_channelpartner"]).Name,
           ContactStreetAddress = !c.Contains("address1_line1") ? string.Empty : c["address1_line1"]
         });

Как бы я избавился от этой ошибки? Любая помощь будет потрясающей.

Спасибо!

1 Ответ

2 голосов
/ 27 августа 2011

Поскольку ваш запрос LINQ должен в конечном итоге преобразоваться в действительное выражение QueryExpression, вы не сможете выполнить некоторые из более сложных задач проекции, потому что OrganizationDataContext недостаточно умен, чтобы запустить простое выражение QueryExpression, а затем применить свое забавное «fieldname = !c.Contains("fieldname") ? string.Empty : c["fieldname"]» вобъем памяти.Вы должны сделать это сами.

Итак, в своем первом запросе просто выполните:

var linqQuery = (from r in orgServiceContext.CreateQuery("opportunity")     
    // snip
    select new
    {
      fieldname = c["fieldname"],
      //etc...
    });

Затем сделайте что-то вроде:

var linqQuery2 = from r in linqQuery.ToList()
                 select new
                 {
                   fieldname = r["fieldname"] == null ? string.Empty : r["fieldname"],
                   //(etc)...
                 };
...