CAML запросы для различных типов

 Комментарии можно оставлять "здесь"

В простом виде CAML запрос может выглядеть следующим образом

<Query>
  <Where>
    <And>
      <Eq>
        <FieldRef Name="f1" />
        <Value Type="Text">abc</Value>
      </Eq>
      <Eq>
        <FieldRef Name="f2" />
        <Value Type="Integer">2</Value>
      </Eq>
    </And>
  </Where>

</Query>

Могут использоваться логические операторы: 
     AND и OR

и некоторые основные операторы сравнения:
<BeginsWith>, <Contains>, <Eq>, <Geq>, <Gt>, <IsNull>,  <IsNotNull>, <Lt>, <Leq>, <Neq>


Пример подстановки в запрос текущего пользователя
<Query>
  <Where>
    <Eq>
      <FieldRef Name="fieldUSer" />
      <Value Type="Integer">
        <UserID />
      </Value>
    </Eq>
  </Where>
</Query>

Пример использования ID пользователя (только в SPQuery)
<Where>
  <Eq>
    <FieldRef Name="recipient" LookupId="TRUE" />
    <Value Type="User">1</Value>
  </Eq>
</Where>
<OrderBy>
  <FieldRef Name="ID" Ascending="False" />

</OrderBy>

Пример использования Boolean
<Where>
    <Eq>
      <FieldRef Name="readMessage" />
      <Value Type="Boolean">1</Value>
    </Eq>
</Where>
Обращаю внимание, что значение может быть и null (например, поле было создано после того как в списке уже были данные). В этом случаи как бы появляется третье значение, которое можно фильтровать только через <IsNull> или  <IsNotNull>
   <Where>
        <IsNull>
              <FieldRef Name="readMessage" />
        </IsNull>

   </Where>

Пример использования текущей даты
<Query>
  <Where>
    <Geq>
      <FieldRef Name="fieldDate" />
      <Value Type="DateTime">
        <Today OffsetDays="-5" />
      </Value>
    </Geq>
  </Where>
</Query>



Когда нам в результате необходимо вывести не только элементы верхнего уровня, но и все элементы, лежащие в папках, то необходимо в свойствах представления или SPQuery установить соотвественно:
  <View BaseViewID="1" Type="HTML" WebPartZoneID="Main" Scope="RecursiveAll" ...
или 
   query.ViewAttributes = "Scope=\"Recursive\"";


Для любителей лямбда выражений очень рекомендую для построения CAML запросов использовать четвёртый способ данной статьи.

Способ заключается в использовании библиотеки Camlex.NET. Очевидным преимуществом является то, что будет невозможно допустить синтаксическую ошибку в запросе.

Вот пример получения CAML запроса:


query.Query = Camlex.Query().Where(w => (string)w["eventType"] == "Новость" && (bool)w["shared"] == true).OrderBy(o => o["eventDate"]).ToString();


 Комментарии можно оставлять "здесь"

Комментариев нет:

Яндекс.Метрика