1

我创建了一个 CAML 查询来获取列表中的某些特定项目,其中包含 OR:

 <Or>
    <Eq><FieldRef Name='Title'/><Value Type='Text'>tileA</Value></Eq>
    <Eq><FieldRef Name='Title'/><Value Type='Text'>titleB</Value></Eq>
 </Or>

现在,如果我将它传递给 list.GetItems() 方法,查询可以正常工作,但是当我这样使用它时它不起作用:

SPContext.Current.List.DefaultView.Query = myStringQuery;
SPContext.Current.List.DefaultView.Update();

我将代码放在一个 webpart (Page_Load()) 中,它被添加到列表中,代码执行,但视图保持未过滤。任何人都知道这可能是什么原因?

4

1 回答 1

2

两件事情:

首先,确保您的 CAML 包含在 Where 元素中:

<Where>
    <Or>
        <Eq><FieldRef Name='Title'/><Value Type='Text'>tileA</Value></Eq>
        <Eq><FieldRef Name='Title'/><Value Type='Text'>titleB</Value></Eq>
    </Or>
</Where>

其次,像这样重新排列您的代码:

SPView view = SPContext.Current.List.DefaultView;
view.Query = myStringQuery;
view.Update();

我知道代码块看起来一样,但既不SPContext也不DefaultView使用私有字段。例如,这里是 的实现DefaultView

internal SPView DefaultView
{
  get
  {
    if (this.m_iDefaultViewIndex == -1)
      return (SPView) null;
    else
      return this[this.m_iDefaultViewIndex];
  }
}

public SPView this[int iIndex]
{
  get
  {
    if (iIndex < 0 || iIndex >= this.Count)
      throw new ArgumentOutOfRangeException();
    else
      return new SPView(this, this.m_arrViewSchema, iIndex);
  }
}

所以:

SPContext.Current.List.DefaultView.Query = myStringQuery;
SPContext.Current.List.DefaultView.Update();

第一行设置 的Query实例的属性,DefaultView而第二行调用Update的新实例DefaultView

于 2011-09-08T20:05:32.527 回答