2009-12-31 39 views
1

我想基于查询的动态CAML查询string.Let我例如Sharepoint动态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(); 
     } 

查询我的SharePoint列表,所以这样一来我的字符串包含所有查询

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

我要查询我的基于这些查询字符串和“AND”的分享点列表

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

if there只有一个查询字符串,然后只有 其中title=ABC ....所以我想我的查询字符串应该是动态的.... 任何想法如何实现这??

回答

6

假设您正在讨论多选择字段...最有可能您将不得不每次创建查询。

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

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

但是,如果你有三个选择通过查询字符串传递: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>"); 
} 
+0

感谢您的回复。问题是我不知道它可能是任何没有。 caml查询取决于查询字符串。这将是“和”运算符之间的不同选项,所以我不能硬编码这些。因为查询字符串可以任意组合 ABC,ABD ABC,ABE,BD ABC,ABE,DE,DF ABC,ABE 所以很多这样我有15个这样的: - )(硬编码不是一个选项) 所以我想有一些逻辑像动态caml查询whre取决于count add和。如果计数是1然后否,如果计数是2然后1并且像thta – 2009-12-31 16:57:27

+0

更新我的答案..您将清理最有可能的查询字符串,但我的代码将创建一个查询。 – 2009-12-31 19:10:52

+0

这在SharePoint 2010中更容易 - http://stackoverflow.com/a/4484656/112194 – ScottE 2012-05-22 16:05:53

0

基本一lgorithm用于创建CAML查询字符串,当你有多个输入是:

  • 如果只有一个校验值,你不需要<And>,刚刚创建的代码
  • 如果你有两个值,你将需要<and>(value1)(value2)</and>
  • 如果有两个以上的,你创建一个循环(伪代码,不好意思):

    foreach (item in values) 
    sQuery = "<And>" + sQuery + item + "</And>" 
    end foreach 
    
+0

你能告诉我如何完全做到这一点你的第三个选项。我想要做类似的事情。像添加AND基于计数。 如果数为1,则NO和如果数为2,则添加一个ADD ......这样 – 2009-12-31 17:00:11

+0

不正确的,因为CAML结构 soemthing东西东西 2011-04-14 08:14:43

+0

@Janis Veinbergs - 确切地说,这就是为什么我'在当前查询字符串前添加一个'“和”',并在最后附加新语句和结尾''“。这会生成您正在显示的同一个表达式树。 – naivists 2011-04-15 11:19:55

0

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

你也一定会喜欢它

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是保持过滤器元件的自定义对象。您可以创建自己的对象并传入此方法。