使用SPQuery检索不同/唯一值的最佳方法是什么?

Ale*_*gas 15 sharepoint caml spquery

我有一个看起来像这样的列表:

Movie          Year
-----          ----
Fight Club     1999
The Matrix     1999
Pulp Fiction   1994
Run Code Online (Sandbox Code Playgroud)

使用CAML和SPQuery对象,我需要从Year列中获取一个不同的项目列表,它将填充下拉控件.

在CAML查询中搜索周围似乎没有这样做的方法.我想知道人们是如何实现这一目标的?

use*_*531 13

另一种方法是使用DataView.ToTable-Method - 它的第一个参数是使列表不同的参数.

            SPList movies = SPContext.Current.Web.Lists["Movies"];
            SPQuery query = new SPQuery();
            query.Query = "<OrderBy><FieldRef Name='Year' /></OrderBy>";

            DataTable tempTbl = movies.GetItems(query).GetDataTable();
            DataView v = new DataView(tempTbl);
            String[] columns = {"Year"};
            DataTable tbl = v.ToTable(true, columns);
Run Code Online (Sandbox Code Playgroud)

然后,您可以继续使用DataTable tbl.

  • 即使这被标记为答案,此方法仍然依赖于从数据库中检索每个列表项,然后*然后*查找唯一值.我认为在CAML中询问如何做到这一点的全部意义在于避免从数据库中检索每个项目...... (2认同)
  • 但是,我同意MgSam,因为CAML不是SQL等实际查询语言的真正替代品.这很好.这个答案确实推动了对话.来自我的+1. (2认同)

Koe*_*ers 5

如果要将不同的结果绑定到例如Repeater的DataSource并通过ItemDataBound事件的e.Item.DataItem方法保留实际项,则DataTable方式不起作用.相反,除了不想将其绑定到DataSource之外,您还可以使用Linq来定义不同的值.

// Retrieve the list. NEVER use the Web.Lists["Movies"] option as in the other examples as this will enumerate every list in your SPWeb and may cause serious performance issues
var list = SPContext.Current.Web.Lists.TryGetList("Movies");

// Make sure the list was successfully retrieved
if(list == null) return;

// Retrieve all items in the list
var items = list.GetItems();

// Filter the items in the results to only retain distinct items in an 2D array
var distinctItems = (from SPListItem item in items select item["Year"]).Distinct().ToArray()

// Bind results to the repeater
Repeater.DataSource = distinctItems;
Repeater.DataBind();
Run Code Online (Sandbox Code Playgroud)

请记住,由于不存在对不同查询的CAML支持,因此此页面上提供的每个示例都将从SPList中检索所有项目.这可能适用于较小的列表,但对于包含数千个列表项的列表,这将严重影响性能.不幸的是,没有更优化的方法来实现同样的目标.