我有一个看起来像这样的列表:
Movie Year ----- ---- Fight Club 1999 The Matrix 1999 Pulp Fiction 1994
使用CAML和SPQuery对象,我需要从Year列中获取一个不同的项目列表,它将填充下拉控件.
在CAML查询中搜索周围似乎没有这样做的方法.我想知道人们是如何实现这一目标的?
另一种方法是使用DataView.ToTable-Method - 它的第一个参数是使列表不同的参数.
SPList movies = SPContext.Current.Web.Lists["Movies"]; SPQuery query = new SPQuery(); query.Query = ""; DataTable tempTbl = movies.GetItems(query).GetDataTable(); DataView v = new DataView(tempTbl); String[] columns = {"Year"}; DataTable tbl = v.ToTable(true, columns);
然后,您可以继续使用DataTable tbl.
如果要将不同的结果绑定到例如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();
请记住,由于不存在对不同查询的CAML支持,因此此页面上提供的每个示例都将从SPList中检索所有项目.这可能适用于较小的列表,但对于包含数千个列表项的列表,这将严重影响性能.不幸的是,没有更优化的方法来实现同样的目标.