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:
This is where it gets a bit tricky. The following example is INCORRECT and will produce an error when run:
This is the correct way to do it:
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>"; |
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>"; |