Что мне следует использовать: SPContext или ClientContext?

Мне нужно извлечь данные из списка SharePoint Online в простом консольном приложении (.net 4.5).
Для этого я добавил ссылку на Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime.
Следующее делает то, что мне нужно ...

ClientContext ctx = new ClientContext(siteUrl);
ctx.Credentials = new SharePointOnlineCredentials(siteUser, securePass);

Web site = ctx.Web;
ctx.Load(site);
List lst = site.Lists.GetByTitle("SomeList");
CamlQuery query = new CamlQuery();
query.ViewXml = @"<View>
                    <ViewFields>
                        <FieldRef Name='Title' />
                    </ViewFields>
                </View>";

ListItemCollection items = lst.GetItems(query);
ctx.Load(items);
ctx.ExecuteQuery();
foreach (var item in items)
{
    Console.WriteLine(item["Title"]);
}

Теперь мне нужен более сложный запрос с Query и RowLimit. В этом более сложном CamlQuery, RowLimit, кажется, игнорируется.

<View>
    <RowLimit>1000</RowLimit>   
    <ViewFields>
      <FieldRef Name='Title' />
      <FieldRef Name='ProductName' />
      <FieldRef Name='GroupName' />
    </ViewFields>
    <Query>
      <Where>
          <Neq>
              <FieldRef Name='GroupName' />
              <Value Type='Lookup'></Value>
          </Neq>
      </Where>
    </Query>
</View>

Я не могу заставить работать RowLimit. Все примеры, с которыми я сталкиваюсь, используют SPContext, который может устанавливать RowLimit для объекта SPQuery.

Для работы SPContext требуется большая DLL-библиотека SharePoint, в то время как ClientContext уже присутствует в Visual Studio (с использованием 2015 г.) и имеет гораздо меньшие библиотеки DLL.

So..

1. Когда мне следует использовать SPContext?
2. Есть ли причина, по которой RowLimit не работает в указанном выше CamlQuery?

Редактировать 13/08 13:15
Проблема, похоже, не в RowLimit, а в самом запросе.

<Neq>
    <FieldRef Name='GroupName' />
    <Value Type='Lookup'></Value>
</Neq>

Кажется, это не работает ...


person Tiele Declercq    schedule 13.08.2015    source источник


Ответы (1)


Поскольку ваша цель - исключить элементы, в которых GroupName поле поиска пусто, замените Neq Element < / а>:

<Neq>
    <FieldRef Name='GroupName' />
    <Value Type='Lookup'></Value>
</Neq>

с элементом IsNotNull:

<IsNotNull><FieldRef Name='GroupName' /></IsNotNull>

Пример

var list = ctx.Web.Lists.GetByTitle(listTitle);
var query = new CamlQuery();
query.ViewXml = 
                       "<View>" +
                          "<RowLimit>1000</RowLimit>" +
                              "<ViewFields>" +
                                  "<FieldRef Name='Title' />" +
                                 "<FieldRef Name='ProductName' />" +
                                 "<FieldRef Name='GroupName' />" +
                               "</ViewFields>" +
                               "<Query>" +
                                  "<Where>" +
                                      "<IsNotNull><FieldRef Name='GroupName' /></IsNotNull>" + 
                                  "</Where>" +
                               "</Query>" +
                          "</View>";

var items = list.GetItems(query);
ctx.Load(items);
ctx.ExecuteQuery();
person Vadim Gremyachev    schedule 14.08.2015