【问题标题】:Dynamically create CAML query动态创建 CAML 查询
【发布时间】:2011-11-25 10:15:41
【问题描述】:

我有一个搜索页面,之前它在 SQL DB 上运行,但现在我们将后端移到 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 中的结构就会完全改变。

我们将不胜感激。

【问题讨论】:

  • SharePoint 2010 还是 MOSS 2007?如果 2010 年你看过 linq 吗?我认为它会更简单。
  • +1 as LINQ to CAML 可能很棒,但它在场景中发生的魔法中存在陷阱sharepointblues.com/2010/09/08/…
  • 我还没有,我现在一定会做,谢谢及时回复:)

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


【解决方案1】:

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

【讨论】:

  • 你可以使用下面的类: public class CamlQueryElements { public string FieldName;公共字符串字段类型;公共字符串字段值;公共字符串比较运算符;公共字符串LogicalJoin; }
【解决方案2】:

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

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

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

【讨论】:

  • Ryan 我已经在使用它了,是的,它有点棘手,但我认为使用动态查询的最佳方法是仅对其进行硬编码,因为它会在您更改整个结构后立即在查询中添加 and 子句。
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2015-10-01
  • 2015-04-09
相关资源
最近更新 更多