2011-08-27 2 views
3

연락처의 NULLS를 풀려고하고 DefaultIfEmpty를 사용하여이 작업을 수행하고 있습니다. 하지만이 오류가 발생합니다.LINQ Error DefaultIfEmpty를 사용할 때

" 'GroupJoin'메서드는 'Join'메서드를 따르지 못하거나 지원되지 않습니다. 지원되는 메서드로 쿼리를 작성하거나 지원되지 않는 메서드를 호출하기 전에 'AsEnumerable'또는 'ToList'메서드를 호출하십시오."

CRM 2011 웹 서비스에서 LINQ-to-CRM 공급자 및 쿼리를 사용하고 있습니다. 나는이 오류를 제거하기 가겠어요 어떻게

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"] 
     }); 

:

내가 사용하고있는 코드? 어떤 도움이라도 굉장합니다.

감사합니다.

+0

사용하고있는 LINQ 제공 :

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

그리고 그런 짓을? – svick

+0

LINQ-to-CRM 공급자를 사용하고 CRM 2011 웹 서비스에서 쿼리하고 있습니다. –

답변

2

LINQ 쿼리가 궁극적으로 유효한 QueryExpression으로 변환되어야하므로 OrganizationDataContext가 간단한 QueryExpression을 실행하고 재미있는 "fieldname = !c.Contains("fieldname") ? string.Empty : c["fieldname"]"을 메모리에 적용 할만큼 똑똑하지 않기 때문에 더 멋진 프로젝션 작업을 수행 할 수 없습니다 . 너 스스로 그렇게해야 해.

그래서 첫 번째 쿼리에서 바로 수행

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

감사! 그래서 두 가지 질문을해야합니까? 두 쿼리를 어떻게 만들 수 있습니까? 죄송합니다. 저는 LINQ를 처음 사용합니다. 당신의 도움을 주셔서 감사합니다! –

+0

좀 더 분명하게하기 위해 그것을 업데이트했습니다. 첫 번째 linqQuery에서 FetchXML로 변환 할 수있는 간단한 작업을 수행하십시오. 그런 다음 linqQuery2에서 첫 번째 linqQuery의 결과를 쿼리한다. ToList()는 비밀입니다. 첫 번째 쿼리가 강제로 실행되고 (FetchXML 및 OrganizationServiceContext 사용) 두 번째 쿼리가 메모리에서 발생하고 있습니다. –

+0

감사합니다. Josh, 나는 이것을 시도해 보았습니다. "CS1928 : 'AnonymousType # 1'에는 'Contains'에 대한 정의가없고 가장 좋은 확장 메소드가 'System.Linq.Queryable.Contains (System. Linq.IQueryable , TSource) '잘못된 인수가 있습니다.' 감사! –