2011-11-25 92 views
4

我有一个serach页面,早期是SQL DB上的功能,但现在我们将后退移至SharePoint,我试图根据用户从下拉框中选择构建查询。动态创建CAML查询

现有的SQL查询是:

string SQLquery "Select companyname,phone,email from Tab where Approved = 1" 

If (country.selectedindex != "") 
{ 
    SQLquery += "AND (country LIKE '%" + country.SelectedValue + "%')" 
} 
If (functional.selectedindex != "") 
{ 
    SQL += "AND (country LIKE '%" + country.SelectedValue + "%')" 
} 
If (state.selectedindex != "") 
{ 
    SQL += "AND (state LIKE '%" + state.SelectedValue + "%') OR (businessareaState like '%" + state.SelectedValue + "%'))" 
} 

这很容易,但我必须在创建基于用户选择CAML相同的查询形成下拉列表。 不知何故,我无法给它一个动态的形状,因为一旦你添加了标准,它的结构就会在CAML中完全改变。

帮助将不胜感激。

+1

SharePoint 2010或MOSS 2007?如果2010年你看过linq?我认为这会更简单。 – Shoban

+0

作为LINQ到CAML的+1可以很好,但它在发生在场景中的魔法中有陷阱http://www.sharepointblues.com/2010/09/08/linq-to-sharepoint-performance-pitfalls/ – Ryan

+0

我还没有,我现在肯定会这样做,谢谢你的及时回复:) – Vishal

回答

2

你可以使用这个免费工具,帮助你建立CAML查询

http://www.u2u.be/res/tools/camlquerybuilder.aspx

请在您的查询有一些变化,你会看到怎样的结构发生变化。基本上,你将不得不建立一个XML文档,而不是使用字符串连接(尽管这也可以工作,在一个XML解析器中构建它可能会更简单)

+0

Ryan我已经在使用它了,是的,它有点棘手,但我已经认为使用动态查询的最佳方式是硬编码它只是因为它会在您添加查询和子句时更改整个结构。 – Vishal

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