动态创建CAML查询

时间:2011-11-25 10:15:42

标签: c# asp.net web-services sharepoint

我有一个先前在SQL DB上运行的serach页面,但现在我们将back-en移动到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 个答案:

答案 0 :(得分:3)

我开发了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是包含过滤器元素的自定义对象。您可以创建自己的对象并传入此方法。

答案 1 :(得分:2)

您可以使用此免费工具来帮助构建您的CAML查询

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

对您的查询做一些变化,您将看到结构如何变化。基本上你必须建立一个XML文档而不是使用字符串连接(虽然它也可以工作,但在XML解析器中构建它可能更简单)