Как запросить объект SPView
У меня есть SPView
объект, который содержит много SPListItem
объекты (в представлении много полей).
Меня интересует только одна из этих областей. Давайте назовем это specialField
Учитывая это представление и specialField, я хочу знать, содержится ли значение в specialField.
Вот способ сделать то, что я хочу сделать:
String specialField = "Special Field";
String specialValue = "value";
SPList list = SPContext.Current.Site.RootWeb.Lists["My List"];
SPView view = list.Views["My View"]; //This is the view I want to query
SPQuery query = new SPQuery();
query.Query = view.Query;
SPListItemCollection items = list.GetItems(query);
foreach(SPListItem item in items)
{
var value = item[specialField];
if(value != null) && (value.ToString() == specialValue)
{
//My value is found. This is what I was looking for.
//break out of the loop or return
}
}
//My value is not found.
Тем не менее, итерация каждого ListItem вряд ли кажется оптимальной, тем более что может быть сотни элементов. Этот запрос будет выполняться часто, поэтому я ищу эффективный способ сделать это.
РЕДАКТИРОВАТЬ Я не всегда буду работать с одним и тем же представлением, поэтому мое решение не может быть жестко закодировано (оно должно быть достаточно универсальным, чтобы можно было изменить список, представление и specialField.
Будет ли лучше привести его к объекту IEnumerable? Скажи что-то вроде этого:
list.GetItems(query).Cast<SPListItem>().Where(item =>
{
return ((item[specialField] != null) && (item[specialField].ToString() == specialValue));
}).Count() > 0;
Будет ли это более эффективным, или я иду в неправильном направлении полностью?
2 ответа
String specialField = "Special Field";
String specialValue = "value";
SPList list = SPContext.Current.Site.RootWeb.Lists["My List"];
SPView view = list.Views["My View"]; //This is the view I want to query
SPQuery query = new SPQuery();
string tmp = view.Query;
if(tmp.Contains("<Where>")) {
//wrap the existing where clause in your needed clause (it should be an And i think)
tmp = tmp.Insert(tmp.IndexOf("<Where>") + ("<Where>".Length), "<And><Eq><FieldRef Name='"+specialField+"'/><Value Type='Text'>"+specialValue+"</Value></Eq>");
tmp = tmp.Insert(tmp.IndexOf("</Where>"), "</And>");
} else {
//add a where clause if one doesnt exist
tmp = "<Where><Eq><FieldRef Name='"+specialField+"'/><Value Type='Text'>"+specialValue+"</Value></Eq></Where>" + tmp;
}
query.Query = tmp;
SPListItemCollection items = list.GetItems(query);
if(item.Count > 0) {
//My value is found. This is what I was looking for.
//break out of the loop or return
} else {
//My value is not found.
}
Вы можете выполнять запросы в Caml. Это хорошая ссылка для понимания запросов в Caml, а также ссылка на программное обеспечение для автоматического создания запросов.