2009-12-11 53 views
11

Có cách "đẹp" để tạo truy vấn CAML cho SharePoint thực hiện điều gì đó như thế này không?SQL IN tương đương trong CAML

SELECT * 
FROM table 
WHERE Id IN (3, 12, ...) 

Hoặc tôi bị kẹt với cơn ác mộng của lồng nhau <Or> nút?


EDIT: Đây là giải pháp của tôi để tạo các nút <Or>.

/// Simulates a SQL 'Where In' clause in CAML 
/// </summary> 
/// <param name="columnType">Specifies the data type for the value contained by the field.</param> 
/// <returns>Nested 'Or' elements portion of CAML query</returns> 
public static string CamlIn<T>(string internalFieldName, string columnType, T[] values) 
{ 
    XDocument doc = new XDocument(); 
    XElement prev = null; 
    int index = 0; 

    while (index < values.Length) 
    { 
     XElement element = 
      new XElement("Or", 
       new XElement("Eq", 
        new XElement("FieldRef", 
        new XAttribute("Name", internalFieldName)), 
       new XElement("Value", 
        new XAttribute("Type", columnType), 
        values[index++].ToString()))); 

     if (index == values.Length - 1) 
     { 
      element.AddFirst(
       new XElement("Eq", 
        new XElement("FieldRef", 
        new XAttribute("Name", internalFieldName)), 
       new XElement("Value", 
        new XAttribute("Type", columnType), 
        values[index++].ToString()))); 
     } 

     if (prev != null) 
      prev.AddFirst(element); 
     else 
      doc.Add(element); 

     prev = element; 
    } 

    return doc.ToString(SaveOptions.DisableFormatting); 
} 

Cách sử dụng:

int[] ids = new int[] { 1, 2, 4, 5 }; 
string query = string.Format("<Where>{0}</Where>", CamlIn("SomeColumn", "Number", ids)); 

Output:

<Where> 
    <Or> 
     <Or> 
      <Or> 
       <Eq> 
        <FieldRef Name=\"SomeColumn\" /> 
        <Value Type=\"Number\">5</Value> 
       </Eq> 
       <Eq> 
        <FieldRef Name=\"SomeColumn\" /> 
        <Value Type=\"Number\">4</Value> 
       </Eq> 
      </Or> 
      <Eq> 
       <FieldRef Name=\"SomeColumn\" /> 
       <Value Type=\"Number\">2</Value> 
      </Eq> 
     </Or> 
     <Eq> 
      <FieldRef Name=\"SomeColumn\" /> 
      <Value Type=\"Number\">1</Value> 
     </Eq> 
    </Or> 
</Where> 

Cũng đã quá tải này để làm việc với Lookup Fields một chút dễ dàng hơn

/// <summary> 
/// Simulates a SQL 'Where In' clause in CAML 
/// </summary> 
/// <param name="lookupId">Specify whether to use the Lookup column's Id or Value.</param> 
/// <returns>Nested 'Or' elements portion of CAML query</returns> 
public static string CamlIn<T>(string internalFieldName, bool lookupId, T[] values) 
{ 
    XDocument doc = new XDocument(); 
    XElement prev = null; 
    int index = 0; 

    while (index < values.Length) 
    { 
     XElement element = 
      new XElement("Or", 
       new XElement("Eq", 
        new XElement("FieldRef", 
         new XAttribute("Name", internalFieldName), 
         lookupId ? new XAttribute("LookupId", "TRUE") : null), 
        new XElement("Value", 
         new XAttribute("Type", "Lookup"), 
         values[index++].ToString()))); 

     if (index == values.Length - 1) 
     { 
      element.AddFirst(
       new XElement("Eq", 
        new XElement("FieldRef", 
         new XAttribute("Name", internalFieldName), 
         lookupId ? new XAttribute("LookupId", "TRUE") : null), 
        new XElement("Value", 
         new XAttribute("Type", "Lookup"), 
         values[index++].ToString()))); 
     } 

     if (prev != null) 
      prev.AddFirst(element); 
     else 
      doc.Add(element); 

     prev = element; 
    } 

    if (values.Length == 1) 
    { 
     XElement newRoot = doc.Descendants("Eq").Single(); 
     doc.RemoveNodes(); 
     doc.Add(newRoot); 
    } 

    return doc.ToString(SaveOptions.DisableFormatting); 
} 

Trả lời

5

FullTextSqlQuery

Có thể tìm kiếm MOSS bằng cách sử dụng câu lệnh SQL, sử dụng lớp FullTextSqlQuery. Tôi không có kinh nghiệm sử dụng cá nhân lớp này. Những bài viết này có thể được sử dụng:

YACAMLQT

Ngoài ra, đó cũng là YACAMLQT (Yet Another CAML Query Tool) mà cho phép bạn tạo các truy vấn CAML SharePoint sử dụng T-SQL cú pháp.

LINQ to SharePoint

Nếu bạn đang lên đến tốc độ với LINQ, thì LINQ to SharePoint project cung cấp một công cụ để truy vấn danh sách SharePoint bằng cách sử dụng cú pháp LINQ. Xin lưu ý, công cụ này vẫn đang trong giai đoạn thử nghiệm alpha, vì vậy nó có thể không được sản xuất sẵn sàng.

U2U CAML Query Builder

Nếu bạn đang làm việc với các truy vấn CAML, tôi sẽ khuyên bạn sử dụng công cụ U2U CAML Query Builder for SharePoint (2003 và 2007) để xây dựng các truy vấn CAML của bạn. Công cụ này cho phép bạn xây dựng chuỗi truy vấn của mình và thực thi nó với danh sách đích, sử dụng giao diện điểm-và-nhấp chuột, như được hiển thị bên dưới.

U2U CAML Query Builder for SharePoint in action http://www.u2u.net/res/Images/Tools/CQB/buildwhereclause6.png

Trong bốn phương pháp trên, tôi có thể đề nghị U2U CAML Query Builder, sau khi sử dụng nó hầu như hàng ngày trong 6 tháng qua. Nó cũng dường như là công cụ CAML được sử dụng rộng rãi nhất trong cộng đồng SharePoint.

Lưu ý, nếu bạn đang xây dựng các truy vấn CAML trong mã, thì tôi khuyên bạn hãy xem CAML.NET project trên CodePlex, cung cấp "một bộ.. Công cụ ngôn ngữ dựa trên NET để tạo năng động, tái sử dụng các thành phần truy vấn CAML"

+0

Không biết về CAML.NET. Có thể cần phải sử dụng nó trong tương lai. Tôi đã làm một cái gì đó tương tự với XElements để tạo ra '' s cần thiết. – Chris

23

Đối với những người sử dụng Sharepoint 2010, có một yếu tố TRÊN sẵn:

http://msdn.microsoft.com/en-us/library/ff625761.aspx

Dưới đây là ví dụ:

SPQuery locationsQuery = new SPQuery(); 
locationsQuery.Query = string.Concat("<Where>", 
             "<In>", 
             "<FieldRef Name='ID' />", 
              "<Values>", 
              "<Value Type='Number'>6</Value>", 
              "<Value Type='Number'>7</Value>", 
              "<Value Type='Number'>8</Value>", 
              "</Values>", 
             "</In>", 
            "</Where>"); 
Các vấn đề liên quan