CodeCaml
CodeCaml has one single entry point, that will allow you to generate CAML - class CQ
.
CQ.Where(CQ.Eq.FieldRef([field_name_or_id]).Value([value]))
generated CAML:
<Where><Eq><FieldRef ID|Name='[field_name_or_id]' /><Value Type='[value_type]'>[value]</Value></Eq></Where>
Value
includes overloads for types string
(Text), int
(Integer), DateTime
(DateTime) and bool
(Bool). Other types can be specified through CQValueType
enum or string.
CQ.Where(
CQ.And(
CQ.Gt.FieldRef('[field_name_or_id]').Value([value]),
CQ.Or(
CQ.Lt.FieldRef('[field_name_or_value]').Value([value]),
CQ.Neq.FieldRef('[field_name_or_id]').Value([value])
)
)
)
generated CAML:
<Where>
<And>
<Gt>
<FieldRef ID|Name='[field_name_or_id]' /><Value Type='[value_type]'>[value]</Value>
</Gt>
<Or>
<Lt>
<FieldRef ID|Name='[field_name_or_id]' /><Value Type='[value_type]'>[value]</Value>
</Lt>
</Neq>
<FieldRef ID|Name='[field_name_or_id]' /><Value Type='[value_type]'>[value]</Value>
</Neq>
</Or>
</And>
<Where>
SharePoint has some CAML tags for predefined values you can make use of. For purposes of a query I implemented Now
, Today
, Month
and UsedID
. These values are accessible throught CQ.PredefinedValue
.
CQ.Where(CQ.Leq.FieldRef(id).Value(CQ.PredefinedValue.Today()))
For operator DateRangesOverlap
, it is necessary to specify multiple field refs. This is done fluently.
CQ.Where(CQ.DateRangesOverlap.FieldRef(id1).FieldRef(id2).FieldRef(id3).Value(CQ.PredefinedValue.Month()))
Operator In
can use multiple values wrapped in Values
element.
CQ.Where(CQ.In.FieldRef(id).Values(CQ.Value("val"), CQ.Value(1), CQ.PredefinedValue.UsedID()))
Sometimes attributes are needed to be set on FieldRef
.
CQ.Where(CQ.Eq.FieldRef(CQ.FieldRef(id).LookupId(true)).Value(1))
CQ.OrderBy(CQ.FieldRef(id))
CQ.GroupBy(CQ.FieldRef(id))
CQ.Concat(
CQ.Where(
CQ.Eq.FieldRef(id).Value(val)
),
CQ.OrderBy(
CQ.FieldRef(id)
)
)
The api also provides methods for generating CAML for properties such as ViewFields
, ViewAttributes
, Webs
, Lists
, etc. for both SPQuery
and other data queries.
query.ViewFields = CQ.ViewFields(CQ.FieldRef(id), CQ.FieldRef(id));
I could think of only Scope as an attribute used often enough to be included. You can still specify other attributes as strings.
query.ViewAttributes = CQ.ViewAttributes.Scope(CQViewScope.Recursive).Attribute("name", "value");
For use in data queries.
query.Webs = CQ.Webs(CQQueryScope.SiteCollection);
For use in data queries.
query.Lists = CQ.Lists(CQ.List(id), CQ.WithIndex(id, value));
query.Lists = CQ.Lists(
CQ.ListsAttributes.BaseType(CQListBaseType.DocumentLibrary)
.Hidden(true)
.MaxListLimit(500)
.ServerTemplate(104),
CQ.List(FieldId)
);