Использование SPQuery с SPList.GetItems(SPView)
-
10-12-2019 - |
Вопрос
у меня есть веб-часть который отображает различные элементы в Спгридвью на основе SPView
.
Кроме того, я реализовал модуль поиска, который при вводе ключевого слова должен получать все элементы, заголовок которых содержит часть введенного ключевого слова, используя SPQuery
.
С использованием SPList.GetItems()
отлично работает при использовании SPQuery
=>
var itemCollection = SPList.GetItems(SPQuery);
Приведенный выше код дает мне те элементы, которые мне нужны, но, к сожалению, и те, которые мне не нужны.Я хочу получить все элементы из SPView
которые соответствуют введенному ключевому слову.
Я обнаружил, что вы можете использовать SPQuery вместе с SPView =>
var itemCollection = SPList.GetItems(SPQuery, "viewName");
Это звучит довольно хорошо, но при более внимательном изучении выясняется, что «viewName» на самом деле должно быть SPView
идентификатор ToString
ред.И что, если SPQuery
содержит <Where>
предложение «viewName» переопределяет этот запрос и просто возвращает каждый элемент в этом конкретном представлении.
Итак, мой вопрос: существует ли способ запроса SPView
напрямую или мне придется проделать болезненную работу?
Код решения
Спасибо, Саймон Дой, за подсказку.
var query = new SPQuery(SPList.GetView(ListViewId))
{
Query = string.Format(string.Concat(
"<Where>",
"<Or>",
"<Or>",
"<Contains>",
"<FieldRef Name='Title'/>",
"<Value Type='Text'>{0}</Value>",
"</Contains>",
"<Contains>",
"<FieldRef Name='FieldAutoGeneratedName'/>",
"<Value Type='Text'>{0}</Value>",
"</Contains>",
"</Or>",
"<Contains>",
"<FieldRef Name='FieldATTCode'/>",
"<Value Type='Text'>{0}</Value>",
"</Contains>",
"</Or>",
"</Where>"
), param)
};
var items = SPList.GetItems(query);
Приведенный выше код возвращает все элементы из указанного списка, соответствующие param
Решение
Как насчет создания объекта SPQuery с использованием конструктора, в который можно передать соответствующий SPView.
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.spquery.aspx
Затем вы можете добавить запрос для включения соответствующих элементов, например:
var query = new SPQuery(spView);
query.Query = String.Format("<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>{0}</Value></Eq></Where>", keyword);
SPListItemCollection listItems = oList.GetItems(query);
Другие советы
Если SPQuery возвращает все элементы списка, то в большинстве случаев QueryString просто неправильный.(В моем варианте странное) поведение по умолчанию заключается в том, что в случае неправильных строк запроса Caml-Query возвращает ВСЕ элементы.
Например распространенная ошибка:QueryString для SPQuery.Query НЕ ДОЛЖЕН включать тег «<Query>».Если это так, он возвращает все элементы и полностью игнорирует предложение Where.