我想基于查询字符串进行动态caml查询。让我用例子解释它
我的查询sting可以是任何
?cat=ABC&cat=ABD&cat=ABE...
?Cat=ABC
?Cat=ABC&cat=ABL
所以没有。现在可以解决任何问题了
我想根据此查询字符串
查询我的sharepoint列表if (HttpContext.Current.Request.QueryString["cat"] != null)
{
string _cat = HttpContext.Current.Request.QueryString["cat"].ToString();
}
所以这样我的字符串包含所有查询
string _cat=ABC,AD,....all.
我想根据这些查询字符串和“AND”
查询我的sharepoint列表where title=ABC and title=AD ....
如果只有一个查询字符串
其中title=ABC
....所以我希望我的查询字符串应该是动态的....
知道如何实现这个吗?
答案 0 :(得分: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>");
}
答案 1 :(得分:2)
检查http://camlex.codeplex.com项目。它的创建完全是为了使用C#lambda表达式简化动态CAML语句的创建。另请查看我的帖子:Build dynamic CAML queries based on query string parameters
答案 2 :(得分: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是包含过滤器元素的自定义对象。您可以创建自己的对象并传入此方法。
答案 3 :(得分:0)
有多个输入时创建CAML查询字符串的基本算法是:
<And>
,只需创建代码<and>(value1)(value2)</and>
如果您有两个以上,则创建一个循环(伪代码,抱歉):
foreach (item in values)
sQuery = "<And>" + sQuery + item + "</And>"
end foreach
答案 4 :(得分:0)
如果你讨厌使用String Concat方法,你必须尝试JohnHolliday's Lib - CAML.NET,我在我的项目中使用它,它只是摇滚。
你也会喜欢它