2016-11-18 3 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; 

Googling, кажется, довести до включения 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> 

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

Проблема: Вы не должны атрибут List="Documents" в первом <FieldRef> элемент вашего соединения.

Пояснение: Атрибут List должен принимать только псевдоним, который определен в предыдущем ListAlias атрибут Join элемента. Первичному списку в соединении нужен только атрибут List, если вы присоединяете дополнительные списки из внешнего списка, и в этом случае псевдоним будет определяться предыдущим объединением. Если атрибут List опущен, основным списком соединения будет список, по которому выполняется запрос.

Сформированный КАМЛ выше запрос иначе действует, если ваши списки принимают следующую форму:

  1. список, который вы запрашиваете с этим КАМЛ (и который я угадывание называется Documents) имеет поле поиска с внутренним именем Doc_x0020_Type.
  2. Этого списка же документов есть текстовое поле с внутренним именем RiO_x0020_ID

Если какой-либо из них является ложным (например, если ваш RiO_x0020_ID поля фактически на Document Types список, а не на Documents), то запрос не удастся. Обратите внимание, что вам не нужно необходимо указать фактическое имя внешнего списка, к которому вы присоединяетесь, поскольку сопоставление совпадает с существующим отношением поля поиска.

Дополнительной литература: Для получения дополнительной информации о том, как использовать играя в КАМЛЕ (и связанное с ним понятие Проекции/Прогнозируемые поля, которые необходимо, если вы хотите сделать какую-либо фильтрацию на основе значений в соединенном иностранном списке) вы можете обратиться к документации Microsoft здесь: https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx

+0

Спасибо за вашу помощь, да, удаление этого списка = «Документы» сделало трюк. Думаю, мне нужно посмотреть библиотеку Camlex и использовать ее. Но спасибо за вашу помощь. –

+1

Да, исправил мой camlex (теперь я знал, что делаю!) –

Смежные вопросы