2013-09-18 3 views
2

Мне не удается создать рабочий запрос с присоединением в моем приложении .net csom. Я использовал эту статью:Sharepoint 2013 .NET CSOM CamlQuery Join

http://msdn.microsoft.com/en-us/library/ff798388.aspx

вот мой код:

ClientContext context = new ClientContext(url); 
Web web = context.Web; 
var list = web.Lists.GetByTitle("Esemény"); 

CamlQuery cq = new CamlQuery(); 
cq.ViewXml= @"<View> 
        <ViewFields> 
         <FieldRef Name='Title' /> 
        </ViewFields> 
        <ProjectedFields> 
         <Field Name='PartnerLookupTitle' Type='Lookup' List='PartnerLookup' ShowField='Title' /> 
        </ProjectedFields> 
        <Joins> 
         <Join Type='LEFT' ListAlias='PartnerLookup'> 
          <Eq> 
           <FieldRef Name='Partner' RefType='ID' /> 
           <FieldRef List='Partner' Name='ID' /> 
          </Eq> 
         </Join> 
        </Joins> 
       </View>"; 

ListItemCollection lista = list.GetItems(cq); 
context.Load(lista); 
context.ExecuteQuery(); 

я получаю исключение с сервера: «Значение не попадает в ожидаемый диапазон.»

Если я извлекаю в ProjectedFields и присоединяется часть запроса CAML он работает :(

+0

Ваш вопрос хороший один (+1 для вас). Я предлагаю вам обратиться за помощью также на сестринский сайт Stack Overflow: [Sharepoint] (http://sharepoint.stackexchange.com). – Renan

ответ

0

присоединяется не общие используемым при выполнении CAML SPQuery. В качестве обходных данные из двух списков могут быть выведены отдельно в два

List<SpListItem>

объекты для нелогич-, а затем вы можете сделать в памяти соединение между двумя списками

0

Эта ошибка возникает из-за некорректного запроса CAML, в частности:.

  • значение ListAlias атрибут Join элемента должен содержать имя списка
  • значение List атрибут Field элемента должен содержать имя списка

Следующий метод показывает, как построить запрос для List Joins and Projections :

public static CamlQuery CreateJoinQuery(string joinListTitle,string joinFieldName,string[] viewdFields,string[] projectedFields) 
{ 
     var qry = new CamlQuery(); 
     qry.ViewXml = @"<View> 
       <ViewFields>"; 
     foreach(var f in viewdFields) { 
      qry.ViewXml+= string.Format("<FieldRef Name='{0}' />",f); 
     } 
     foreach(var f in projectedFields) { 
      qry.ViewXml+= string.Format("<FieldRef Name='{0}{1}' />",joinListTitle,f); 
     } 
     qry.ViewXml+= @"</ViewFields> 
       <ProjectedFields>"; 
     foreach(var f in projectedFields){ 
      qry.ViewXml+= string.Format("<Field Name='{0}{1}' Type='Lookup' List='{0}' ShowField='{1}' />",joinListTitle,f); 
     } 
     qry.ViewXml+= string.Format(@"</ProjectedFields> 
       <Joins> 
        <Join Type='LEFT' ListAlias='{0}'> 
         <Eq> 
          <FieldRef Name='{1}' RefType='ID' /> 
          <FieldRef List='{0}' Name='ID' /> 
         </Eq> 
        </Join> 
       </Joins> 
      </View>",joinListTitle,joinFieldName); 
     return qry; 
} 

Примем следующие списки:

  • Contacts - содержит Страна подстановок поле (список целей: Страны)
  • Countries

Тогда в следующем примере показано, как получить список элементов из обоих списков.

Использование

var listTitle = "Contacts"; 
var joinListTitle = "Countries"; 
var joinFieldName = "Country"; 
var projectedFields = new []{"ID","Title"}; 
var viewFields = new[] { "Title" }; 

using (var ctx = new ClientContext(webUri)) 
{ 
     var list = ctx.Web.Lists.GetByTitle(listTitle); 
     var qry = CreateJoinQuery(joinListTitle,joinFieldName,viewFields,projectedFields); 
     var items = list.GetItems(qry); 
     ctx.Load(items); 
     ctx.ExecuteQuery(); 
} 
+0

Можете ли вы рассказать нам, если это работает? –

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