I am Trying to write an Dynamic Caml Query.
I did it like This:
CamlQuery qry = new CamlQuery();
string qryStatus = "";
string qryCategory = "";
foreach (RiskStatus sta in filter.Status)
{
if (sta == null)
continue;
qryStatus = "<Eq><FieldRef Name='Status' /><Value Type='Text'>" + sta.Name + "</Value></Eq>" + qryStatus;
}
if (filter.Status.Length >= 2)
{
qryStatus = "<Or>" + qryStatus + "</Or>";
}
foreach (RiskCategory ctg in filter.Categories)
{
if (ctg == null)
continue;
qryCategory = "<Eq><FieldRef Name='Category' /><Value Type='Text'>" + ctg.Name + "</Value></Eq>" + qryCategory;
}
if (filter.Categories.Length >= 2)
{
qryCategory = "<Or>" + qryCategory + "</Or>";
}
qry.ViewXml = "<View Scope='RecursiveAll'>"
+ "<Query>"
+ " <Where>"
+ " <And>"
+ qryStatus
+ qryCategory
+ " </And>"
+ " </Where>"
+ "</Query>"
+ "</View>";
return qry;
I use this Test values:
CategoryArray[0] = new TestCategory { Name = "(2) TestCategory2" };
StatusArray[0] = new TestStatus { Name = "(1) TestStatus1" };
CategoryArray[1] = new TestCategory { Name = "(3) TestCategory3" };
StatusArray[1] = new TestStatus { Name = "(2) TestStatus2" };
This is the Result I get:
<View Scope='RecursiveAll'>
<Query>
<Where>
<And>
<Or>
<Eq><FieldRef Name='Status' /><Value Type='Text'>(2) TestStatus2</Value></Eq>
<Eq><FieldRef Name='Status' /><Value Type='Text'>(1) TestStatus1</Value></Eq>
</Or>
<Or>
<Eq><FieldRef Name='Category' /><Value Type='Text'>(3) TestCategory3</Value></Eq>
<Eq><FieldRef Name='Category' /><Value Type='Text'>(2) TestCategory2</Value></Eq>
</Or>
</And>
</Where>
</Query>
</View>
It works fine But if I add a third value I get the exception "Cannot complete this action.\n\nPlease try again."
Added Value:
StatusArray[2] = new TestStatus { Name = "(3) Status3" };
Result:
<View Scope='RecursiveAll'>
<Query>
<Where>
<And>
<Or>
<Eq><FieldRef Name='Status' /><Value Type='Text'>(3) TestStatus3</Value></Eq>
<Eq><FieldRef Name='Status' /><Value Type='Text'>(2) TestStatus2</Value></Eq>
<Eq><FieldRef Name='Status' /><Value Type='Text'>(1) TestStatus3</Value></Eq>
</Or>
<Or>
<Eq><FieldRef Name='Category' /><Value Type='Text'>(3) TestCategory3</Value></Eq>
<Eq><FieldRef Name='Category' /><Value Type='Text'>(2) TestCategory2</Value></Eq>
</Or>
</And>
What am I doing wrong? (This is my first time working with Caml Query)