Проблемы с фильтрацией списка точек доступа с помощью Caml

Я пытаюсь отфильтровать список SharePoint так, чтобы отображались только элементы с полем «Управление», содержащим строку «Да», но всякий раз, когда я перехожу к оператору ctx.ExecuteQuery (), моя программа взрывается. Я считаю, что мой CAMLQuery структурирован правильно, поэтому я не уверен, просто ли я использую его неправильно или мне что-то не хватает. Любая помощь была бы замечательной! Благодарность! Код, который у меня сейчас есть, размещен ниже:

Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml = "<Query>" + "< Where >" + "<Eq>" + "< FieldRef Name='Management'/>" + "< Value Type='Text'>Yes</ Value >" + "</Eq>" + "</ Where >" + "</ Query >";
myList.GetItems(qry);
ListItemCollection listItems = myList.GetItems(qry);
ctx.Load(listItems);
ctx.ExecuteQuery();

person Kyle    schedule 11.07.2017    source источник
comment
Какой тип столбца представляет собой поле управления?   -  person Thriggle    schedule 11.07.2017
comment
Я не уверен, что понимаю ваш вопрос. Это просто столбец, содержащий строку. Я просто пытаюсь протестировать фильтрацию с его помощью, поэтому проверяю, есть ли внутри строка Да   -  person Kyle    schedule 11.07.2017
comment
Спасибо! Я хотел убедиться, что это не поле «Да / Нет», которое нужно будет запрашивать иначе, чем поля «Текст» и «Выбор».   -  person Thriggle    schedule 11.07.2017
comment
Ах хорошо! Отредактирую вопрос, чтобы было понятнее.   -  person Kyle    schedule 11.07.2017
comment
Пожалуйста, публикуйте решения как ответы, а не как обновления вашего вопроса. Я отменил вашу правку, которую вы можете увидеть в редакциях. Это во избежание недоразумений. Спасибо.   -  person Bugs    schedule 12.07.2017
comment
Спасибо за совет. Был не в курсе лучших практик для этого экземпляра, так что спасибо!   -  person Kyle    schedule 12.07.2017


Ответы (2)


В вашем коде отсутствует тег <View>, который будет обертывать ваш тег <Query> в CAML.

С добавлением корневого элемента <View> правильный XML-код CAML будет следующим:

qry.ViewXml = 
    "<View>"+
         "<Query>"+
            "<Where>"+
                 "<Eq>"+
                     "<FieldRef Name='Management'/>"+
                     "<Value Type='Text'>Yes</Value>"+
                 "</Eq>"+
            "</Where>"+
        "</Query>"+
   "</View>";

Дополнительное устранение неполадок

Чтобы помочь в устранении неполадок, вы можете попробовать выполнить тот же запрос через клиентскую объектную модель JavaScript.

  1. Посетите сайт SharePoint в Internet Explorer и нажмите F5, чтобы открыть инструменты разработчика.
  2. На вкладке «Консоль» введите следующие строки кода и выполните (нажимая Enter или Ctrl + Enter) их по одной строке за раз:

-

var ctx = new SP.ClientContext();
var list = ctx.get_web().get_lists().getByTitle("Company Employees");
var qry = new SP.CamlQuery();
qry.set_viewXml("<View><Query><Where><Eq><FieldRef Name=\"Management\"/><Value Type=\"Text\">Yes</Value></Eq></Where></Query></View>");
var items = list.getItems(qry);
ctx.load(items);
ctx.executeQueryAsync(function(){alert("success!");},function(sender,args){alert(args.get_message());});
person Thriggle    schedule 11.07.2017
comment
Я попытался реализовать это, но ExecuteQuery по-прежнему выдает ошибку. Как вы думаете, эта проблема связана с тем, что я пытаюсь фильтровать элементы списка, а не только элементы, показанные в определенном представлении? - person Kyle; 11.07.2017
comment
Нет, установка View XML для запроса - это обычно хороший способ получить отфильтрованное подмножество элементов. Можете ли вы записать текст сообщения об ошибке? Многие разные вещи могут идти не так, как например, внутреннее имя поля отличается, или список превышает пороговое значение представления списка 5000 элементов, но это трудно определить без дополнительной информации. - person Thriggle; 11.07.2017
comment
Вызывается ошибка Microsoft.SharePoint.Client.ServerException: «Невозможно выполнить это действие. Пожалуйста, попробуйте еще раз »Так что я не совсем уверен, как это интерпретировать. Я исследовал ошибку, и все, что я обнаружил, это то, что эта конкретная ошибка иногда возникает, когда вы что-то удаляете и не обновляете, но я ничего не удалил. - person Kyle; 11.07.2017
comment
Я получил сообщение с веб-страницы после выполнения последней инструкции в ваших действиях по устранению неполадок. Сообщение гласило: Один или несколько типов полей установлены неправильно. Перейдите на страницу настроек списка, чтобы удалить эти поля. - person Kyle; 11.07.2017
comment
Это прошло успешно, но ничего не изменило со списком. - person Kyle; 11.07.2017
comment
Тип - одна строка текста - person Kyle; 11.07.2017
comment
Только что выяснилось, что запрос правильно сортирует данные, но ничего не происходит, потому что я на самом деле ничего не делаю с запрошенным списком! Большое спасибо за помощь @Thriggle - person Kyle; 11.07.2017

РЕШЕНИЕ ПОСЛЕ ПОМОЩИ Благодаря вашей помощи я смог выяснить, как создать новое представление с желаемой фильтрацией, используя следующий код. Основная проблема заключалась в запросе Caml - мне пришлось удалить теги и, а затем удалить несколько строк перед созданием представления. Ниже мое рабочее решение:

Web myWeb = ctx.Web;
List myList = myWeb.Lists.GetByTitle("Company Employees");
SPClient.View view = myList.DefaultView;
CamlQuery qry = new CamlQuery();
qry.ViewXml =
"<Where><Eq><FieldRef Name=\"Management\"/><Value Type='Text'>Yes</Value></Eq></Where>";
ViewCollection viewColl = myList.Views;
string[] viewFields = { "Title", "Promoted", "Intern", "Management" };
ViewCreationInformation creationInfo = new ViewCreationInformation();
creationInfo.Title = "Management";
creationInfo.RowLimit = 50;
creationInfo.ViewFields = viewFields;
creationInfo.ViewTypeKind = ViewType.None;
creationInfo.SetAsDefaultView = false;
creationInfo.Query = qry.ViewXml;
viewColl.Add(creationInfo);
ctx.ExecuteQuery();
person Kyle    schedule 12.07.2017