Verwenden von SPQuery mit SPList.getItems(Ansicht)
-
10-12-2019 - |
Frage
Ich habe eine Webparts das zeigt eine Vielzahl von Elementen in einem spgridview basierend auf einem SPView
.
Zusätzlich habe ich ein Suchmodul implementiert, das bei Eingabe eines Schlüsselworts alle Elemente mit einem Titel abrufen soll, der einen Teil des eingegebenen Schlüsselworts enthält SPQuery
.
Wobei SPList.GetItems()
funktioniert gut bei Verwendung des SPQuery
=>
var itemCollection = SPList.GetItems(SPQuery);
Der obige Code gibt mir die Artikel, die ich will, aber leider auch alle, die ich nicht will.Was ich möchte, ist, alle Gegenstände von der zu bekommen SPView
die dem eingegebenen Schlüsselwort entsprechen.
Ich habe herausgefunden, dass Sie SPQuery zusammen mit SPView =>
var itemCollection = SPList.GetItems(SPQuery, "viewName");
Was ziemlich gut klingt, aber bei näherer Betrachtung zeigt sich, dass der "Ansichtsname" eigentlich der sein sollte SPView
s-KENNUNG ToString
aufl.Und das, wenn der SPQuery
enthält eine <Where>
-Klausel überschreibt der "viewName" diese Abfrage und gibt nur jedes Element in dieser bestimmten Ansicht zurück.
Also meine Frage, gibt es eine Möglichkeit, a abzufragen SPView
direkt oder muss ich eine schmerzhafte Arbeit machen?
Lösungscode
Danke, Simon Doy, für den Hinweis.
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);
Der obige Code gibt alle Elemente aus der angegebenen Listenansicht zurück, die mit dem übereinstimmen param
Lösung
Wie wäre es mit dem Erstellen des SPQuery-Objekts mit dem Konstruktor, in dem Sie die entsprechende SPView übergeben können.
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.spquery.aspx
Sie könnten dann eine Abfrage hinzufügen, um die entsprechenden Elemente einzuschließen, etwa:-
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);
Andere Tipps
Wenn die SPQuery alle Elemente der Liste zurückgibt, ist die Abfragezeichenfolge in den meisten Fällen einfach falsch.Das (in meiner Option seltsame) Standardverhalten ist, dass bei falschen Abfragezeichenfolgen eine Caml-Abfrage ALLE Elemente zurückgibt.
Zum Beispiel von einem häufigen Fehler:Die Abfragezeichenfolge für SPQuery.Die Abfrage darf NICHT das "<Query>"-Tag.Wenn ja, gibt es alle Elemente zurück und ignoriert die Where-Klausel vollständig.