Как запросить объект SPView - PullRequest
2 голосов
/ 11 января 2011

У меня есть 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 вряд ли кажутся оптимальными, тем более что их может быть несколько сотен.Этот запрос будет выполняться часто, поэтому я ищу эффективный способ сделать это.

EDIT Я не всегда буду работать с одним и тем же представлением, поэтому мое решение не может быть жестко закодировано (он должен быть достаточно универсальным, чтобы можно было изменить список, представление и specialField.

Было бы лучше привести его к объекту IEnumerable? Скажите что-то вроде этого:быть более эффективным или я полностью иду в неправильном направлении?

Ответы [ 2 ]

3 голосов
/ 12 января 2011
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.
}
0 голосов
/ 11 января 2011

Вы можете выполнять запросы в Caml . Эта является хорошей ссылкой для понимания запросов в Caml, а эта является ссылкой на программное обеспечение для автоматического создания запросов.

...