Динамически создавать CAML-запрос - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть страница поиска, которая раньше работала в БД SQL, но теперь мы переместили бэк-эн в SharePoint, я пытаюсь построить запрос на основе выбора пользователя из выпадающего списка.

Существующий запрос SQL был:

string SQLquery "Select companyname,phone,email from Tab where Approved = 1"

If (country.selectedindex != "")
{
   SQLquery += "AND (country LIKE '%" + country.SelectedValue + "%')"
}
If (functional.selectedindex != "")
{
   SQL += "AND (country LIKE '%" + country.SelectedValue + "%')"
}
If (state.selectedindex != "")
{
   SQL += "AND (state LIKE '%" + state.SelectedValue + "%') OR ( businessareaState like '%" + state.SelectedValue + "%'))"
}

Это было легко, но я должен создать тот же запрос в CAML на основе выбора пользователя из выпадающих списков. Почему-то я не могу придать ему динамическую форму, так как структура полностью меняется в CAML, как только вы добавляете и критерии в нем.

Помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Я разработал код C # для построения динамического запроса. Это так

 public string GenerateQuery(IList<CamlQueryElements> lstOfElement)
    {
        StringBuilder queryJoin = new StringBuilder();
        string query = @"<{0}><FieldRef Name='{1}' /><Value {2} Type='{3}'>{4}</Value></Eq>";
        if (lstOfElement.Count > 0)
        {
            int itemCount = 0;
            foreach (CamlQueryElements element in lstOfElement)
            {
                itemCount++;
                string date = string.Empty;
                // Display only Date
                if (String.Compare(element.FieldType, "DateTime", true) == 0)
                    date = "IncludeTimeValue='false'";
                queryJoin.AppendFormat(string.Format(query, element.ComparisonOperators,
                                element.FieldName, date, element.FieldType, element.FieldValue));

                if (itemCount >= 2)
                {
                    queryJoin.Insert(0, string.Format("<{0}>", element.LogicalJoin));
                    queryJoin.Append(string.Format("</{0}>", element.LogicalJoin));
                }
            }
            queryJoin.Insert(0, "<Where>");
            queryJoin.Append("</Where>");
        }
        return queryJoin.ToString();
    }

IList lstOfElement - это пользовательский объект, который содержит элементы фильтра. Вы можете создать свой собственный объект и перейти в этот метод.

2 голосов
/ 25 ноября 2011

Вы можете использовать этот бесплатный инструмент для создания ваших запросов CAML

http://www.u2u.be/res/tools/camlquerybuilder.aspx

Сделайте несколько изменений в своем запросе, и вы увидите, как меняется структура. По сути, вам придется создавать XML-документ, а не использовать конкатенацию строк (хотя это также может сработать, возможно, будет проще создать его в XML-парсере)

...