2016-11-18 7 views
1

안녕하세요 저는 셰어 포인트와 caml의 세계에 처음 왔기 때문에 올바른 방향으로 나를 가리켜 줄 수있는 힌트가 있습니다.Sharepoint Camlex Caml 가입 오류

좋은 방법으로 caml 쿼리를 작성하는 데 Camlex https://camlex.codeplex.com/ 라이브러리를 선택했습니다. 내가 먼저 코드에 InnerJoin

var caml = 
       Camlex.Query(). 
       InnerJoin(x => x[CesaDocument.DocType_field].PrimaryList(CESAContext.Documents).ForeignList(CESAContext.DocumentType)). 
       Where(x => (string)x[CesaDocument.RiOID_field] == id). 
       Scope(ViewScope.RecursiveAll).ToCamlQuery(); 

에 추가 될 때까지

모든

가 잘 작동 된 것은 마지막에 가입 나왔다 - 그게 내가 소스 코드를 가지고 문제이고 나는 그럭저럭 믿음 처음에는 Join.

그래서이 코드를 내게주었습니다.

<View Scope="RecursiveAll"> 
<Joins> <Join Type="INNER" ListAlias="Document Types">  
<Eq>  <FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" />  
<FieldRef List="Document Types" Name="Id" />  
</Eq> </Join> </Joins> <Query> <Where>  <Eq> 
<FieldRef Name="RiO_x0020_ID" /> 
<Value Type="Text">1</Value> 
</Eq> </Where> </Query></View> 

그러나 여전히 나에게이 코드를 -giving 오류가 발생한 것을.

<nativehr>0x80070057</nativehr><nativestack></nativestack> 

실행 기능을 호출했을 때.

List list = null; 
      ListItemCollection ListCollection = null; 

      list = this.Web.Lists.GetByTitle(List); 

      ListCollection = list.GetItems(query); 


      this.Load(ListCollection); 
      this.ExecuteQuery(); 

return ListCollection; 

인터넷 검색 allowunsafeUpdates=true을 설정하는 가져올 것으로 보인다하지만 난 Micrsoft.Sharepoint.Client 객체를 사용하고 있는데 내가 그 속성을 볼 수없고 내가 업데이트하고 있습니다. Caml 쿼리를 SP CAML 쿼리 도우미 온라인에 붙여 넣었으며 예상대로 실행됩니다.

내가이 일을 제대로하고 있습니까? 몇 가지 방법을 시도했지만 아무 소용이 없습니다. SPQuery 객체를 사용해야합니까, CSOM에서 작동 할 수 있습니까? 그렇다면 어떤 라이브러리입니까?

내 가입시 Document_x0020_Types을 사용해야합니까? 편집 - 시도했지만 작동하지 않았습니다.

편집 2 그냥 작동하지만 아니 겠지.

<Joins> 
    <Join Type="INNER" ListAlias="Document_x0020_Types"> 
    <Eq> 
     <FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" /> 
     <FieldRef List="Document_x0020_Types" Name="Id" /> 
    </Eq> 
    </Join> 
</Joins> 
<View Scope="RecursiveAll"> 
    <Query> 
    <Where> 
     <Eq> 
     <FieldRef Name="RiO_x0020_ID" /> 
     <Value Type="Text">2</Value> 
     </Eq> 
    </Where> 
    </Query> 
</View> 

편집 3 그래서 지금은 내 camlex의 generater을 고칠 수의 Caml의 형식에 대해 좀 더 알고 있었다.

var caml = 
       Camlex.Query() 
       .InnerJoin(x => x[CesaDocument.DocType_field].ForeignList(CESAContext.DocumentType)) 
       .Where(x => (string)x[CesaDocument.RiOID_field] == id) 
       .Scope(ViewScope.RecursiveAll) 
       .ToCamlQuery(); 

기본 비트를 삭제하면 트릭을 수행했습니다.

+0

RiOID는 문서 목록 또는 문서 유형 목록의 필드입니까? – Thriggle

+0

RiOID가 '문서'목록에 있습니다. 유형 목록에 없습니다. –

답변

1

<View Scope="RecursiveAll"> 
    <Joins> 
     <Join Type="INNER" ListAlias="Document Types"> 
      <Eq> 
       <FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" /> 
       <FieldRef List="Document Types" Name="Id" /> 
      </Eq> 
     </Join> 
    </Joins> 
    <Query> 
     <Where> 
      <Eq> 
       <FieldRef Name="RiO_x0020_ID" /> 
       <Value Type="Text">1</Value> 
      </Eq> 
     </Where> 
    </Query> 
</View> 

문제는 ...이 빌더 당신을 위해 생성 된 것입니다 가정 : 당신은 당신의 가입의 첫 번째 <FieldRef> 요소에 속성 List="Documents"을 필요가 없습니다.

설명 :List 속성 만 Join 요소의 앞 ListAlias 속성에 정의 된 별칭을 취할 예정이다. 외부 목록에서 추가 목록을 조인 할 경우 조인의 기본 목록에 List 특성 만 있으면됩니다.이 경우 별칭은 선행 조인에 의해 정의됩니다. List 속성을 생략하면 조인의 기본 목록은 쿼리가 실행되는 목록이됩니다.

  1. 목록이 CAML에 쿼리하는 (내가 이름 문서를 짐작하는) 조회 필드가 있습니다

    위에서 생성 CAML 쿼리는 목록은 다음과 같은 모양을, 그렇지 않으면 유효 내부 이름은 Doc_x0020_Type입니다. 그 중 하나가 잘못된 경우 동일한 문서 목록이 RiO_x0020_ID

의 내부 이름으로 텍스트 필드를 가지고

  • 다음, (예 RiO_x0020_ID이 필드를 잘 작성하지 Documents에서 Document Types 목록에 실제로있는 경우 등) 쿼리가 실패합니다. 은 매핑이 기존 조회 필드 관계와 평행하기 때문에 조인 할 외부 목록의 실제 이름을 지정해야합니다.

    추가 읽기 : CAML에서 조인을 사용하는 방법에 대한 자세한 내용 (조인 된 외부 목록의 값을 기준으로 필터링을 수행하려는 경우 필요한 프로젝션/예상 필드 개념) https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx

  • +0

    네 도움을 주셔서 감사합니다, 예 그 목록을 제거 = "문서"트릭 않았다. 나는 Camlex 라이브러리와 나의 사용법을 살펴볼 필요가 있다고 생각합니다. 그러나 당신의 도움에 감사드립니다. –

    +1

    그래, 내 camlex 고정 (지금 내가 뭘하는지 알았어!) –