2016-11-18 53 views
1

嗨,我是新來的sharepoint和caml世界,所以任何提示指向我在正確的方向有幫助。Sharepoint Camlex Caml加入錯誤

我拿起了Camlex https://camlex.codeplex.com/庫來幫助我以一種很好的方式進行caml查詢。

所有運作良好,直到我在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(); 

添加起初代碼拋出了加入末 - 相信這是我得到的源代碼的問題,我設法得到在開始時加入。

因此,這給了我這個代碼。

<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> 

但仍然錯誤 - 給我這個代碼。

<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 Query Helper Online中,並按預期運行。

我正在做這個對嗎? 我試過幾種方法,但無濟於事。 我應該使用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 所以現在我知道一點關於CAML的我能解決我的camlex generater格式。

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屬性,則連接的主要列表將成爲執行查詢的列表。

上面生成的CAML查詢,如果你的列表採取以下形狀否則有效:

  1. 名單,你是這個CAML查詢(和我猜名爲文件)的查找字段內部名稱爲Doc_x0020_Type
  2. 這同樣的文件列表中有一個文本字段的RiO_x0020_ID

內部名稱如果任這些都是假的(比如,如果你的RiO_x0020_ID場實際上是Document Types名單上,而不是在Documents),那麼查詢將失敗。請注意,不需要需要指定要加入的外部列表的實際名稱,因爲映射與現有的查找字段關係相似。

延伸閱讀:有關如何使用的詳細信息聯接在CAML(和預測的相關概念/投影領域,如果你想根據所加入的外國列表中的值來進行任何過濾這是必要的)您可以在此處參閱Microsoft的文檔:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx

+0

感謝您的幫助,是刪除那個List =「Documents」做的伎倆。我想我需要看看Camlex圖書館和我的使用情況。但是,謝謝你的幫助。 –

+1

是的,我修好了camlex(現在我知道我在做什麼了!) –