2014-06-18 1 views
0

여러 개의 술어로 실행 된 워크 플로의 모든 인스턴스 (AsyncOperationBase 테이블에서)를 가져 오려고합니다.PredicateBuilder 및 LINQ to CRM

var predicate = PredicateBuilder.False<Service.AsyncOperation>(); 

//Apparently, checking for null is suppose to prevent my issue from happening... 
predicate = predicate.And(x => x.Name == searchWorkflowDefinitionText.Text); 
predicate = predicate.And(x => x.StatusCode != null); 
predicate = predicate.And(x => x.StatusCode.Value == 10); 
predicate = predicate.And(x => x.WorkflowActivationId != null); 


foreach (Guid s in listBox3.Items) 
{ 
    predicate = predicate.Or(x => x.WorkflowActivationId.Id == s); 
} 


var r = (from c in xrm.CreateQuery<Service.AsyncOperation>().AsExpandable().Where(predicate) 
         select c).ToList(); 

하지만 난 그만 둘 :

난 당신이 내가 여기 PredicateBuilder

동적 술어를 구축하기 위해 노력하고있어 myArray.Contains(x.WorkflowActivationId.Id) 같은 것을 사용할 수 없습니다 아는 것은 내가 지금까지 가지고 무엇을 많은 LINQ to CRM의 두려워한 예외 :

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

내가 아는 한,이 오류가 발생하지 않기 위해서는 속성을 '크롤링'해야합니다. 같은 것들 :

predicate = predicate.Or(x => x.WorkflowActivationId == s); 

predicate = predicate.Or(x => x.WorkflowActivationId.Id == s); 

또한 변경되어야한다, 술어의 왼쪽은 개체 속성이어야합니다. 다시 말하면, 내가 아는 한, 내 술어는 이러한 요구 사항을 충족 시키므로 여기서 약간의 손실이 있습니다.

아이디어가 있으십니까?

+0

CRM LINQ 구현에 몇 가지 한계가 있음을 기억하십시오. 확인하지는 않았지만 아마도 이것이 하나입니다. –

+0

@GuidoPreite 네, 알고 있습니다. 그래서 내가 뭘 비난 해야할지 물었습니다 : 나와 내 술어에 대한 오해, 또는 당신이 실제로 데이터에 액세스 할 수없는 CRM 2011 공급자에 대한 약한 LINQ :) –

답변

0

나는이 부분을함으로써 CRM의 한계에 LINQ를 피할 필요가 있다고 생각한다. 1

는 :

var t = xrm.AsyncOperationSet.Where(x => x.StatusCode.Value == 10 && x.Name == wkname).Select(y => new Service.AsyncOperation 
       { 
        AsyncOperationId = y.AsyncOperationId.Value, 
        WorkflowActivationId = y.WorkflowActivationId 
       }).ToList(); 

난 정말 그 순간 만이 두 속성이 필요합니다.

그러면 t의 콘텐츠에 대한 전체 LINQ 액세스를 가질 수 있습니다.

var y = t.Where(x => myArray.Contains(x.WorkflowActivationId.Id)).ToList();