пятница, 1 июня 2012 г.

Создания CAML запроса на лету

В одном из проектов возникла необходимость сформировать CAML запрос, но точных сведений о том какой он будет в итоге не было. Порывшись на англоязычных формах нашел похожие вопросы с решениями. После чего они были немного изменены под мои нужды.
Все это выполняется двумя функциями. На входе одной из которых имеется двумерный массив строк.
Допустим нам необходимо сформировать запрос к списку и получить все элементы где fieldName1=value и где fieldName2 пустое

 
            string[,] s = new string[2, 5];
            s[0, 0] = "Eq";//Условие (в данном случае равно) (Eq,Geq,Leq...)  
            s[0, 1] = "fieldName1";// Название столбца списка  
            s[0, 2] = "Text";// Тип столбца  
            s[0, 3] = "value";// искомое значение  
            s[0, 4] = "And";
            s[1, 0] = "IsNull";
            s[1, 1] = "fieldName2"; 
            s[1, 2] = "";
            s[1, 3] = "";
            s[1, 4] = "And";
А вот собственно и функции:
 
private static string CreateCAMLQuery(string[,] parameters)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < parameters.Length/5; i++)
    {
        AppendEQ(sb, parameters[i, 0], parameters[i, 1], 
               parameters[i, 2], parameters[i, 3]);
        if (i > 0)
        {
            sb.Insert(0, "<" + parameters[i,4] + ">");
            sb.Append("");
        }
    }
    sb.Insert(0, "");
    sb.Append("");
    return sb.ToString();
}

private static void AppendEQ(StringBuilder sb, string Eq,
           string FieldRefName,  string ValueType, string value)
{
    sb.AppendFormat("<{0}>", Eq);
    sb.AppendFormat("<"+"fieldref name="{0}">", FieldRefName);
//Для IsNull и для IsNotNull нет необходимости в указнии type
    if (Eq != "IsNull" & Eq != "IsNotNull")
        sb.AppendFormat("{1}",ValueType,value);
    sb.AppendFormat("", Eq);
} 
Формируем запрос
 
            SPQuery query = new SPQuery();
            query.Query = CreateCAMLQuery(s);
            SPListItemCollection collection= list.GetItems(query);
//В переменной collection есть все элемент удовлетворяющие требованиям
//К отдельным элемента обращаемся в цикле
            foreach (SPListItem item in collection)
            {
                string title = item.Title;
            }
Функция CreateCAMLQuery на выходе дает вот такую xml
 

  
    
      
      value
    
    
      
    
  

Комментариев нет:

Отправить комментарий