Writing CAML queries can sometimes make your head hurt. Not because it’s terribly complicated, but because there’s not much useful information out there that demonstrates, with REAL examples, how these should be written. So let’s see if we can clarify this:
Scenario 1
Get me all items in a list
WHERE fullName equals the currently logged in user.
1
2
3
4
5
6
7
8
9
10
11
| SPWeb web = SPControl.GetContextWeb(Context);
string fullName = web.CurrentUser.Name;
SPQuery oQuery = new SPQuery();
oQuery.Query =
"<Where>" +
"<Eq><FieldRef Name='FullName'/><Value Type='Text'>'" + fullName + "'</Value></Eq>" +
"</Where>" +
"<OrderBy><FieldRef Name='StartTime' Ascending='FALSE'></FieldRef></OrderBy>";
|
Scenario 2
Get me all items in a list
WHERE fullName equals the currently logged in user
AND status equals ‘Complete’.
1
2
3
4
5
6
7
8
9
10
11
12
13
| SPWeb web = SPControl.GetContextWeb(Context);
string fullName = web.CurrentUser.Name;
SPQuery oQuery = new SPQuery();
oQuery.Query =
"<Where>" +
"<And>" +
"<Eq><FieldRef Name='FullName'/><Value Type='Text'>'" + fullName + "'</Value></Eq>" +
"<Eq><FieldRef Name='Status'/><Value Type='Text'>Complete</Value></Eq>" +
"</And>" +
"</Where>" +
"<OrderBy><FieldRef Name='StartTime' Ascending='FALSE'></FieldRef></OrderBy>";
|
Scenario 3
Get me all items in a list
WHERE fullName equals the currently logged in user
AND status equals ‘Complete’
AND manager is James Lane.
This is where it gets a bit tricky. The following example is
INCORRECT and will produce an error when run:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SPWeb web = SPControl.GetContextWeb(Context);
string fullName = web.CurrentUser.Name;
SPQuery oQuery = new SPQuery();
oQuery.Query =
"<Where>" +
"<And>" +
"<Eq><FieldRef Name='FullName'/><Value Type='Text'>'" + fullName + "'</Value></Eq>" +
"<Eq><FieldRef Name='Status'/><Value Type='Text'>Complete</Value></Eq>" +
"<Eq><FieldRef Name='Manager'/><Value Type='Text'>James Lane</Value></Eq>" +
"</And>" +
"</Where>" +
"<OrderBy><FieldRef Name='StartTime' Ascending='FALSE'></FieldRef></OrderBy>";
|
This is the correct way to do it:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| SPWeb web = SPControl.GetContextWeb(Context);
string fullName = web.CurrentUser.Name;
SPQuery oQuery = new SPQuery();
oQuery.Query =
"<Where>" +
"<And>" +
"<And>" +
"<Eq><FieldRef Name='FullName'/><Value Type='Text'>'" + fullName + "'</Value></Eq>" +
"<Eq><FieldRef Name='Status'/><Value Type='Text'>Complete</Value></Eq>" +
"</And>" +
"<Eq><FieldRef Name='Manager'/><Value Type='Text'>James Lane</Value></Eq>" +
"</And>" +
"</Where>" +
"<OrderBy><FieldRef Name='StartTime' Ascending='FALSE'></FieldRef></OrderBy>";
|
Scenario 4
Get me all items
WHERE fullName equals the currently logged in user
AND status equals ‘Complete’
OR status equals ‘On Hold’.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| SPWeb web = SPControl.GetContextWeb(Context);
string fullName = web.CurrentUser.Name;
SPQuery oQuery = new SPQuery();
oQuery.Query =
"<Where>" +
"<And>" +
"<Eq><FieldRef Name='FullName'/><Value Type='Text'>'" + fullName + "'</Value></Eq>" +
"<Or>" +
"<Eq><FieldRef Name='Status'/><Value Type='Text'>Complete</Value></Eq>" +
"<Eq><FieldRef Name='Status'/><Value Type='Text'>On Hold</Value></Eq>" +
"</Or>" +
"</And>" +
"</Where>" +
"<OrderBy><FieldRef Name='StartTime' Ascending='FALSE'></FieldRef></OrderBy>";
|