2009-12-31 72 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是保持過濾器元件的自定義對象。您可以創建自己的對象並傳入此方法。