2013-02-02 8 views
0

강령 :CRM LINQ 쿼리 - 유효하지 않은 상태

var site = CrmRepository.QueryFor<Account>() 
       .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString()) 
       .FirstOrDefault(); 
SiteCases = CrmRepository.QueryFor<Incident>() 
        .Where(i => i.AccountId.Id == site.Id 
           && (i.iss_Status != new OptionSetValue(
             (int)StatusOptionSet.Closed) 
            && i.iss_Status != new OptionSetValue(
             (int)StatusOptionSet.PendingFinalization)) 
           || (i.iss_ResolutionDate == null 
            || i.iss_ResolutionDate > 
              DateTime.Today.AddDays(-30)) 
           || (ShowFullCaseHistoryBox.Checked)) 
        .AsEnumerable() 
        .Select(i => new CrmCaseListItem(i)) 
        .ToList(); 

세부 정보 :

  • CrmRepository가 CrmSvcUtil에 의해 생성 된 CRM Linq에 컨텍스트에 대한 래퍼입니다가, 적응 다른 데이터 저장소에 사용되는 공용 IRepository 인터페이스로 전송합니다. QueryFor<Incident>() 호출은 컨텍스트 자체에서 CreateQuery<Incident>() 호출과 동일합니다.

  • iss_Status은 "옵션 세트"유형 속성입니다. StatusOptionSet은 코드에서 옵션 값의 사용을 단순화하기위한 enum입니다.

  • iss_ResolutionDate은 단순한 설명을 위해 사례 해결 레코드를 참조하는 대신에 설명이 포함되어 있으며 워크 플로에서 사례가 문제가 해결 될 때까지 실제로 "해결"되지 않기 때문에 사례 기록 및 관련 기록은 처리되고 감사되었으므로 SLA 의무에 대해 우리는 문제를 완전히 해결하기 위해 결의안이 적용되었을 때와 별도로 문제가 언제 풀릴 것인지를 알아야합니다.

  • 기본적인 아이디어는 또는 사용자의 소원, 하나 열린 상태에서, 또는 지난 30 일 (해결) 폐쇄 된 특정 계정과 관련된 사건을 (우리가 케이스를 호출하는) 보여주는 것입니다 전체 기록을 볼 수 있습니다 (이 경우 공개 또는 폐쇄 된 모든 사례가 검색됩니다).

  • ShowFullCaseHistoryBox은 Winforms 체크 박스입니다. 이 옵션을 선택하면 계정에 대한 전체 사례 기록을 검색해야합니다.

  • CrmCaseListItem은 DataGridView의 받침으로 사용되는 DTO입니다. 생성자에서 인시던트를 취해 그리드에 표시된 속성을 표시합니다.

오류 :

Invalid 'where' condition. An entity member is invoking an invalid property or method.

[질문 : 나는 그 무효의 일을하려고하고 무엇

? 계정 ID와 일치하는 첫 번째 절 (따라서 프로젝션 필요)은 자체적으로 정상적으로 작동하므로 다른 점 중 하나라고 가정해야합니다. 그러나 어느 부분을 결정할 수는 없습니다. 조사되는 사건의 속성은 예상치 못한 것이거나 조작 된 것이 아니며, 이는 Queryables의 일반적인 no-no이므로 실제로 여기에서 손실됩니다.

(다시 편집 된)이 편집 : 절의 알려진 모든 좋은 요소를 각각의 절을 평가하기 위해 몇 가지 테스트를 통해 실행 지금까지 제안의 몇 가지를 사용하여 연결 후

var site = CrmRepository.QueryFor<Account>() 
       .Where(a => a.iss_OperatorSiteId == OperatorSiteId.ToString()) 
       .FirstOrDefault(); 
SiteCases = CrmRepository.QueryFor<Incident>() 
       .Where(i => (i.AccountId.Id == site.Id) && 
         (
          (i.iss_Status.Value != (int) StatusOptionSet.Closed 
          && i.iss_Status.Value != (int) StatusOptionSet.PendingFinalization) 
          || (i.iss_ResolutionDate != null 
           && i.iss_ResolutionDate.Value > DateTime.Today.AddDays(-30)) 
         //|| ShowFullCaseHistoryBox.Checked 
         ) 
       ) 
       .AsEnumerable() 
       .Select(i => new CrmCaseListItem(i)) 
       .ToList(); 

여전히 작동하지 않을 것 유일한 것은 전체 사례 기록을 표시하는 체크 박스의 체크입니다 (기본적으로 상태 또는 해상도 날짜에 대해 앞의 두 조항 중 하나를 무시) : 다시 함께, 여기서 일하는 가장 가까운 것입니다 .그것은 (인라인 표현식을 주석 처리하지 않고) 또는 변수로 추출 된 것처럼 작동하지 않습니다. 다른 모든 것은 예상대로 작동하는 것 같습니다. 이 기능은 선택 사항이므로 전혀 작동하지 않을 수도 있습니다. 아무 방법이 없으면 고객에게 부드럽게 전달할 것입니다. 그러나이 기능은 내가 가깝기 때문에 실제로 작동하고 싶습니다. 이견있는 사람?

+0

쿼리에서'.ToString'을 옮기고 문자열을 미리 만들어야한다고 생각합니다. 'string operatorSiteIdString = OperatorSiteId.ToString();'그런 다음 쿼리에서 해당 문자열 표현을 사용하십시오. – jessehouwing

+0

동일하게 적용될 수 있습니다. DateTime.Today.AddDays (-30) ... – jessehouwing

+0

Where를 다시 작동 AccountId 기준으로 바꾼 다음 각 추가 기준을 하나 하나 테스트하면서 다시 테스트하십시오. –

답변

0

LINQ to CRM을 쿼리 식으로 변환해야합니다. 쿼리 표현식을 처리 할 때는 옵션 설정 값의 int 값을 사용해야합니다. 옵션 집합 속성에서 .Value를 호출하고 열거 형을 원하는 값으로 캐스팅하여 문제가 해결되는지 확인하십시오.

엔티티에 Early Bound Enum Properties를 만드는 Early Bound Generator을 사용할 수도 있습니다. 그런 다음 열거 형을 int로 변환 할 필요가 없으며 .value도 넣지 않아도됩니다.

관련 문제