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