When we have to filter more than 2 column, it is very difficult to create CAML query. For example, our application have more than 2 drop down (Bind to SharePoint list column) as search criteria then it is difficult to generate CAML query. To create dynamic CAML query please check this code
class Program {
public static string CreateCAMLQuery(List < string > parameters, string orAndCondition, bool isIncludeWhereClause) {
StringBuilder sb = new StringBuilder();
if (parameters.Count == 0) {
AppendEQ(sb, "all");
}
int j = 0;
for (int i = 0; i < parameters.Count; i++) {
if (!string.IsNullOrEmpty(parameters[i].Split(';')[3])) {
AppendEQ(sb, parameters[i]);
if (i > 0 && j > 0) {
sb.Insert(0, "<" + orAndCondition + ">");
sb.Append("</" + orAndCondition + ">");
}
j++;
}
}
if (isIncludeWhereClause) {
sb.Insert(0, "<Where>");
sb.Append("</Where>");
}
return sb.ToString();
}
public static void AppendEQ(StringBuilder sb, string value) {
string[] field = value.Split(';');
sb.AppendFormat("<{0}>", field[2].ToString());
sb.AppendFormat("<FieldRef Name='{0}'/>", field[0].ToString());
sb.AppendFormat("<Value Type='{0}'>{1}</Value>", field[1].ToString(), field[3].ToString());
sb.AppendFormat("</{0}>", field[2].ToString());
}
static void Main(string[] args) {
List < string > objColumns = new List < string > ();
// here, format is like: "Column name(internal name of column);Column type; Conditional operator; Search string (input by user)
objColumns.Add("Title;Text;Eq;" + "abc");
objColumns.Add("FileLeafRef;Text;Eq;" + "PQR");
objColumns.Add("DropDown;Text;Eq;" + "abc");
objColumns.Add("FileLeafRef1;Text;Eq;" + "PQR");
string query = CreateCAMLQuery(objColumns, "And", true);
Console.WriteLine(query);
Console.Read();
}
}