Запрос CAML заказывается неправильно

Может ли кто-нибудь помочь мне с этим запросом CAML? Когда я переворачиваю Ascending атрибут с TRUE на FALSE (также пробовал True и False ), он не меняет порядок набора результатов.

Остальная часть CAML верна, она создается инструментом, и возвращаются соответствующие результаты.

<Where>
  <And>
    <And>
      <Eq>
        <FieldRef Name="Branch"/>
        <Value Type="Text">Camp 1</Value>
      </Eq>      
      <Eq>
        <FieldRef Name="Type"/>
        <Value Type="Choice">Day</Value>
      </Eq>
    </And>
    <Geq>
      <FieldRef Name="StartDateTime"/>
      <Value Type="DateTime">2009-01-05T00:00:00Z</Value>
    </Geq>
  </And>
  <OrderBy>
    <FieldRef Ascending="TRUE" Name="Title" />
  </OrderBy>
</Where>

Ответов (3)

Решение

Разве OrderBy не должен находиться за пределами предложения Where?

    <Where>
  <And>
    <And>
      <Eq>
        <FieldRef Name="Branch"/>
        <Value Type="Text">Camp 1</Value>
      </Eq>      
      <Eq>
        <FieldRef Name="Type"/>
        <Value Type="Choice">Day</Value>
      </Eq>
    </And>
    <Geq>
      <FieldRef Name="StartDateTime"/>
      <Value Type="DateTime">2009-01-05T00:00:00Z</Value>
    </Geq>
  </And>
  </Where>
<OrderBy>
    <FieldRef Ascending="TRUE" Name="Title" />
  </OrderBy>

См. http://msdn.microsoft.com/en-us/library/ms442728.aspx

Я потратил почти целую неделю, пытаясь заставить работать заказы по дате с помощью объекта Client OM CamlQuery. Наконец я понял, что мне нужно установить

camlQuery.DatesInUtc = true;

Мне кажется, что если вы используете собственную объектную модель и объект SPQuery, SharePoint интерпретирует эту дату как UTC по умолчанию (в нашей среде), как только вы переходите к объекту CamlQuery с ClientOM, вам необходимо установить этот параметр.

Я согласен с ответом выше, <Query> должен находиться за пределами <Where>. Также обратите внимание, что при сравнении с полями DateTime обычно рекомендуется включать атрибут IncludeTimeValue:

<Geq>
      <FieldRef Name="StartDateTime"/>
      <Value Type="DateTime" IncludeTimeValue="FALSE">2009-01-05T00:00:00Z</Value>
</Geq>

и установите для него значение false или true, в зависимости от того, хотите ли вы включать значения времени в свой запрос или нет.