[英]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.