Просто провел значительное время сегодня утром, пытаясь решить эту проблему, и я думаю, что у меня есть для вас решение
Первое - давайте начнем с некоторой общей структурой псевдо:.
ParentTable: Id, название, ChildTableReference
ChildTable: Id, название, BabyTableReference
BabyTable: Id, название
Итак, мы имеем родительскую таблицу, которая содержит ссылку. Таблица, привязанная к этой ссылке, содержит ссылку на другую таблицу.
Вот простой практический пример:
(родитель) CustomerOrder: Id, название, CustomerID
(ребенок) Заказчик: Id, название, RegionId
(ребенок) Регион: Id, Название
Так что, если мы хотим следующий ответ запроса:
CustomerOrder_Id, CustomerOrder_Title, Customer_Title, Region_Title
Первая часть XML легко:
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
Но как склеивать таблицы? Мы используем объединения.
Первой Регистрация очень прост:
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
Это первое соединение является нормально, и если все, что мы хотели сделать, это посмотреть имя клиента, мы просто должны добавить наш прогноз, и мы бы хорошо идти , Но нам также нужен регион этого клиента. Для этого нам нужно второе соединение. Трюк ко второму соединению заключается в том, чтобы добавить ссылку на список для инструкции FIRST FieldRef. Точная строка: FieldRef List = 'Customer' Name = 'RegionID' RefType = 'ID'. Обратите внимание, что атрибут List = указывает на псевдоним ссылки Child. Другими словами, существует список ссылок, называемый Клиентами, который содержит столбец RegionID, который является повторным идентификатором. Это должно быть равно нашей новой таблице с псевдонимом «Регионы», основанной на корневой таблице «Регион» в атрибуте «Идентификатор».
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
Мы сейчас почти дома. На этом этапе нам нужно создать проецируемые поля, чтобы выплескивать атрибуты Region.Title и Customer.Title.
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
Собираем все вместе, то, ваш CAML запрос будет:
//Completed query
<View>
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
<Joins>
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
<Query />
</View>
Это должно помочь вам всю дорогу. Кроме того, вы можете запросить (например, предложение Where) для любого элемента, к которому вы присоединились, при условии, что поддерживается тип поля (текст, refid, number и т. Д.). Просто помните, что если вы собираетесь запросить, например, идентификатор региона, вам нужно будет добавить идентификатор к вашим ProjectedFields.
// completed query with WHERE clause filtering by BABY table ID.
<View>
<ViewFields>
<FieldRef Name='ID' />
<FieldRef Name='Title' />
<FieldRef Name='Customer_Title' />
<FieldRef Name='Region_Title' />
</ViewFields>
<Joins>
<Join Type='INNER' ListAlias='Customers'>
<Eq>
<FieldRef Name='CustomerID' RefType='ID' />
<FieldRef List='Customer' Name='ID' />
</Eq>
</Join>
<Join Type='INNER' ListAlias='Regions'>
<Eq>
<FieldRef List='Customers' Name='RegionID' RefType='ID' />
<FieldRef List='Regions' Name='ID' />
</Eq>
</Join>
</Joins>
<ProjectedFields>
<Field ShowField='Title' Type='Lookup' Name='Customer_Title' List='Customers' />
<Field ShowField='ID' Type='Lookup' Name='Region_ID' List='Regions' />
<Field ShowField='Title' Type='Lookup' Name='Region_Title' List='Regions' />
</ProjectedFields>
<Query>
<Where>
<Eq>
<FieldRef Name='Region_ID' LookupId='True' />
<Value Type='Integer'>1</Value>
</Eq>
</Where>
</Query>
</View>
BTW - CamlJS не поддерживает это вложенное соединение, так как он не запрашивает или не обрабатывает атрибут «List =» первой части инструкции FieldRef Eq. – skrile