簡體   English   中英

Sharepoint動態caml查詢問題?

[英]Sharepoint dynamic caml query problem?

我想基於查詢字符串進行動態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 ....所以我希望我的查詢字符串應該是動態的。...知道如何實現這一點嗎?

假設您正在談論“多選選擇”字段...最有可能您每次都必須創建查詢。

您的代碼將需要確定傳入的類別數,然后生成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>");
}

檢查http://camlex.codeplex.com項目。 正是為了簡化使用C#lambda表達式創建動態CAML語句而創建的。 還要檢查我的文章: 基於查詢字符串參數構建動態CAML查詢

我已經開發了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是自定義對象,其中包含過濾器元素。 您可以創建自己的對象並將其傳遞給此方法。

有多個輸入時創建CAML查詢字符串的基本算法是:

  • 如果只檢查一個值,則不需要<And> ,只需創建代碼
  • 如果您有兩個值,則需要<and>(value1)(value2)</and>
  • 如果您有兩個以上,則創建一個循環(偽代碼,對不起):

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

如果您不喜歡使用String Concat方法來執行此操作,則必須嘗試JohnHolliday的Lib-CAML.NET ,我在項目中使用了它,但效果卻很糟糕

你也會愛上它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM