1

我想根据查询字符串进行动态caml查询。让我用例子来解释一下

我的查询字符串可以是任何东西

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

所以不行。可以是任何东西现在问题开始了

我想根据这个查询字符串查询我的共享点列表

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

所以这样我的字符串包含所有的查询

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

我想根据这些查询字符串和“AND”查询我的共享点列表

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

如果只有一个查询字符串,那么只有在哪里title=ABC......所以我希望我的查询字符串应该是动态的......知道如何实现这一点吗?

4

5 回答 5

6

假设您正在谈论多选选择字段......很可能您每次都必须创建查询。

您的代码将需要确定传入的类别数量,然后生成 CAML。例如,如果只传递了 ABC,您的查询将是(注意没有<And>标签):

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

但是,如果您通过 QueryString 传入三个选项:ABC、ABD 和 ABE,您会得到(注意<And>标签围绕每两个组):

<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>

编辑:

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>");
}
于 2009-12-31T16:03:10.427 回答
2

检查http://camlex.codeplex.com项目。它的创建正是为了简化使用 C# lambda 表达式创建动态 CAML 语句。另请查看我的帖子:基于查询字符串参数构建动态 CAML 查询

于 2011-03-09T08:48:25.007 回答
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 是包含过滤器元素的自定义对象。您可以创建自己的对象并传递给此方法。

于 2012-03-08T09:48:05.417 回答
0

当您有多个输入时,创建 CAML 查询字符串的基本算法是:

  • 如果只有一个值要检查,则不需要<And>,只需创建代码
  • 如果你有两个值,你将需要<and>(value1)(value2)</and>
  • 如果您有两个以上,则创建一个循环(伪代码,抱歉):

    foreach (item in values)
     sQuery = "<And>" + sQuery + item + "</And>"
    end foreach
    
于 2009-12-31T16:15:43.927 回答
0

如果你讨厌使用 String Concat 方法,你必须尝试JohnHolliday 的 Lib - CAML.NET,我在我的项目中使用它,它只是摇滚。

你也会喜欢的

于 2010-01-02T13:21:00.510 回答