views:

1214

answers:

3

Hi,

I want to dynamic caml query based on query string.Let me explain it with example

my query sting can be anything

?cat=ABC&cat=ABD&cat=ABE...
?Cat=ABC
?Cat=ABC&cat=ABL

so no. can be anything now the problem begins

I want to query my sharepoint list based on this query string

if (HttpContext.Current.Request.QueryString["cat"] != null)
        {
            string _cat = HttpContext.Current.Request.QueryString["cat"].ToString();
        }

so this way my string contains all the query

string _cat=ABC,AD,....all.

I want to query my sharepoint list based on these query string and with "AND"

where title=ABC and title=AD ....

if there is only one query string then only where title=ABC....so I want my query string should be dynamic.... Any idea how to acheive this??

+1  A: 

Assuming you are talking about a Multi-select choice field... most likely you will have to create the query each time.

Your code is going to need to determine how many categories are passed in and then generate the CAML. For example, if only ABC is passed your query would be (notice there are no <And> tags):

<Where>
  <Eq>
    <FieldRef Name='Category'/>
    <Value Type='Choice'>ABC</Value>
  </Eq>
</Where>

But if you have three choices passed in via QueryString: ABC, ABD, and ABE you would get (notice the <And> tags surround each group of two):

<Where>
  <And>
    <And>
      <Eq>
        <FieldRef Name='Category'/>
        <Value Type='Choice'>ABC</Value>
      </Eq>
      <Eq>
        <FieldRef Name='Category'/>
        <Value Type='Choice'>ABD</Value>
      </Eq>
    </And>
    <Eq>
      <FieldRef Name='Category'/>
      <Value Type='Choice'>ABE</Value>
    </Eq>
  </And>
</Where>

Edit:

static void Main(string[] args)
{
    try
    {
        string[] parameters = { "ABC", "DEF", "GHI" };
        string camlQuery = CreateCAMLQuery(parameters);
        Console.WriteLine(camlQuery);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    Console.WriteLine("Press any key...");
    Console.ReadKey();
}

private static string CreateCAMLQuery(string[] parameters)
{
    StringBuilder sb = new StringBuilder();

    if (parameters.Length == 0)
    {
        // perhaps set a default query?
        AppendEQ(sb, "all");
    }

    // "AND" each parameter to the query
    for (int i = 0; i < parameters.Length; i++)
    {
        AppendEQ(sb, parameters[i]);

        if (i > 0)
        {
            sb.Insert(0, "<And>");
            sb.Append("</And>");
        }
    }

    sb.Insert(0, "<Where>");
    sb.Append("</Where>");

    return sb.ToString();
}

private static void AppendEQ(StringBuilder sb, string value)
{
    // put your field's internal name in place of Category
    sb.Append("<Eq>");
    sb.Append("<FieldRef Name='Category'/>");
    sb.AppendFormat("<Value Type='Choice'>{0}</Value>", value);
    sb.Append("</Eq>");
}
Kit Menke
Thanks for the repy. The problem is I don't know it could be any no. of caml queries depending on the query string.It would be "and" operator between different options so I can't hardcode these. because query string can be any combination ABC,ABDABC,ABE,BDABC,ABE,DE,DFABC,ABEso like this many I have 15 like these :-)( hardcoding not an option)SO I was thinking of having some logic like dynamic caml query whre depending on count add And . IF count is 1 then no and if count is 2 then 1 and like thta
AB
Updated my answer.. you will have clean up the query string most likely, but my code will create a query.
Kit Menke
A: 

The basic algorithm for creating the CAML query string when you have multiple inputs is:

  • If there is only one value to check, you don't need the <And>, just create the code
  • If you have two values, you will need <and>(value1)(value2)</and>
  • If you have more than two, you create a loop (pseudocode, sorry):

    foreach (item in values)
     sQuery = "<And>" + sQuery + item + "</And>"
    end foreach
    
naivists
could you tell me how exactly to do this your 3rd option. I want to do something similar to this. like add AND based on count. If count is 1 then No AND and if count is 2 then Add one ADD...like this
AB
A: 

If you hate doing it using the String Concat method, You got to Try the JohnHolliday's Lib - CAML.NET, I use it in my project and it just rocks.

You too will love it

Kusek