Using AND/OR in a SPSiteDataQuery

A quick note about using AND/OR in a SPSiteDataQuery:
You can only have 2 conditions below an AND/OR element in the query.
Examples:

Valid:
<And>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
</And>

<Or>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
</Or>

Invalid:
<And>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 <Eq><FieldRef Name=”Field1″><Value Type=”Text”>Value</Value></Eq>
</And>

<Or>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 <Eq><FieldRef Name=”Field1″><Value Type=”Text”>Value</Value></Eq>
</Or>

You can wrap AND/OR nodes in other AND/OR's.  If you need three conditions, you would do the following:

Valid
:

<And>
 <And>
  <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
  <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 </And>
 <Eq><FieldRef Name=”Field1″><Value Type=”Text”>Value</Value></Eq>
</And>

<Or>
 <Or>
  <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
  <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 </Or>
 <Eq><FieldRef Name=”Field1″><Value Type=”Text”>Value</Value></Eq>
</Or>

If you need more conditions, you need to get creative with your wrapping, but it can be done.

Leave a Reply