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.
如果要将不同的结果绑定到例如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中检索所有项目.这可能适用于较小的列表,但对于包含数千个列表项的列表,这将严重影响性能.不幸的是,没有更优化的方法来实现同样的目标.
归档时间: |
|
查看次数: |
46188 次 |
最近记录: |