List.GetItems (представление) SharePoint возвращает ВСЕ элементы вместо отфильтрованных элементов представления.

Я пытаюсь подсчитать количество элементов в списке на основе представления. Каждый метод, который я пробовал до сих пор, возвращает только общую сумму списка. Я пробовал практически все методы, с которыми сталкивался во время поиска, и все заканчивает тем же самым результатом.

Вот один из методов, которые я пробовал:

SPWeb web = SPContext.Current.Web;
SPView view = web.GetViewFromUrl("url to my view");
int count = view.ParentList.GetItems(view).Count;

В моем списке 28 элементов, но представление, на которое я ссылаюсь, фильтрует его и показывает четыре элемента. Я ожидаю, что мой счет будет 4, а не 28, но всегда получаю 28.

Вот еще один метод, который я пробовал:

SPSite site = SPContext.Current.Site;
SPWeb web = site.OpenWeb();

SPQuery MyQuery = new SPQuery();
MyQuery.Query = "<Query><Where><Eq><FieldRef Name='strStatus' /><Value Type='Text'>submitted</Value></Eq></Where></Query>";

IEnumerable<SPListItem> results = web.Lists["Requests"].GetItems(MyQuery).Cast<SPListItem>();

// results.Count() is 28...  should be 4

Итак, в этом методе я пропускаю представление и просто пытаюсь передать запрос CAML. При тестировании моего запроса в U2U, как и ожидалось, возвращаются четыре результата ...

Более широкая картина заключается в том, что я делаю это внутри обработчика событий OnMenuItemDataBound моего настраиваемого элемента управления меню. Я не знаю, имеет ли это значение вообще, но идея, к которой я стремлюсь, заключается в том, что каждый элемент, который ссылается на представление в определенном списке, будет показывать количество элементов в этом представлении рядом со ссылкой.

Есть идеи, почему я получаю общий список вместо отфильтрованных итогов? Спасибо!


person SeanW    schedule 19.03.2010    source источник


Ответы (1)


Если я правильно напомнил, вам нужно удалить <Query> из вашего SPQuery. Строители CAML используют его, но в настоящем SPQuery в нем нет необходимости. Конечно, вам нужно убедиться, что поля существуют.

MyQuery.Query = "<Where><Eq><FieldRef Name='strStatus' /><Value Type='Text'>submitted</Value></Eq></Where>";
person Francisco Aquino    schedule 19.03.2010
comment
Запрос - это всего лишь один из способов сделать это ... в исходном посте я просто показал, как я пытался это сделать, используя представление и используя запрос, но все же получая те же результаты. - person SeanW; 19.03.2010
comment
@SeanW, если свойство Query в SPQuery неверно, вы вернете все элементы. В вашей демонстрации удалите <Query> и закрывающий тег </Query>. Я не знаю, почему CamlQueryBuilder оставляет их там, но он делает синтаксис запросов неправильным, если вы просто скопируете и вставите его. - person naivists; 19.03.2010
comment
Ооо, теперь я понимаю, что Ф. Акино пытался сказать - да, я тоже помню, что читал это в какой-то момент. Я дома на выходных, но первым делом попробую в понедельник утром. Спасибо! - person SeanW; 20.03.2010
comment
Чтобы добавить путаницы, если вы пишете xml для веб-служб, правильный синтаксис - ‹query› ‹Query› ‹Where› - person Tom Clarkson; 22.03.2010
comment
Спасибо, я этого не знал. Почему он возвращает все предметы? Должен генерировать исключение или возвращать null, если мне нужны все элементы, я не буду использовать запрос. - person Gaotter; 09.09.2010
comment
Если вы используете клиентскую объектную модель в SP 2010, вам необходимо заключить свой запрос в ‹View› ‹/View›, иначе он также вернет все элементы. - person Robert Kaucher; 21.07.2011