C# 在sharepoint中查询多个任务列表
我正在尝试使用以下工具查询SharePoint中的多个任务列表:C# 在sharepoint中查询多个任务列表,c#,sharepoint,C#,Sharepoint,我正在尝试使用以下工具查询SharePoint中的多个任务列表: SPSiteDataQuery query = new SPSiteDataQuery(); query.Lists = "<Lists ServerTemplate=\"171\" />"; query.Query = string.Concat("<Where>", "<Neq>",
SPSiteDataQuery query = new SPSiteDataQuery();
query.Lists = "<Lists ServerTemplate=\"171\" />";
query.Query = string.Concat("<Where>",
"<Neq>",
"<FieldRef Name='Checkmark' />",
"<Value Type='Calculated'>Completed</Value>",
"</Neq>",
"</Where>");
query.Webs = "<Webs Scope=\"Recursive\" />";
query.ViewFields = ViewFields = "<FieldRef Name='Title' /><FieldRef Name='AssignedTo' />";
SPListItemCollection dtTasks = web.GetListItem(query);
return dtTasks;
SPSiteDataQuery query=new SPSiteDataQuery();
query.Lists=“”;
query.query=string.Concat(“”,
"",
"",
“已完成”,
"",
"");
query.Webs=“”;
query.ViewFields=ViewFields=“”;
SPListItemCollection dtTasks=web.GetListItem(查询);
返回任务;
如果AssignedTo字段设置为UserMulti(),则此选项无效
我想我可以通过循环列表(通过标题硬编码到代码中)然后收集列表项结果来解决这个问题:
string[] listCollection = { "List1", "List2" };
SPListItemCollection collection = null;
foreach (var list in listCollection)
{
SPList spList = web.Lists.TryGetList(list);
if (spList != null)
{
SPQuery qry = new SPQuery();
qry.Query =
@"<Where>
<And>
<Leq>
<FieldRef Name='DueDate' />
<Value Type='DateTime'>
<Today />
</Value>
</Leq>
<Neq>
<FieldRef Name='Checkmark' />
<Value Type='Calculated'>Completed</Value>
</Neq>
</And>
</Where>";
qry.ViewFields = "<FieldRef Name='Title' /><FieldRef Name='AssignedTo' />";
collection = spList.GetItems(qry);
}
}
return collection;
string[]listCollection={“List1”、“List2”};
SPListItemCollection=null;
foreach(listCollection中的变量列表)
{
SPList SPList=web.Lists.TryGetList(列表);
if(spList!=null)
{
SPQuery qry=new SPQuery();
查询=
@"
完整的
";
qry.ViewFields=“”;
collection=spList.GetItems(qry);
}
}
回收;
但这当然会覆盖每个列表的SPListItemCollection集合
如何存储每次迭代列表中的项目 您可以使用
collection.GetDataTable()
从SPListItemCollection
获取DataTable
,然后使用DataTable.merge()
方法将结果合并到单个DataTable中
foreach (var list in listCollection)
{
var results = new DataTable();
SPList spList = web.Lists.TryGetList(list);
if (spList != null)
{
SPQuery qry = new SPQuery();
qry.Query = "...";
results.Merge(spList.GetItems(qry).GetDataTable());
}
}
return results;
或者,将查询中的
SPListItem
添加到在foreach外部声明的新空SPListItemCollection
,如下所示。这样,您就可以直接访问项目
SPListItemCollection result = new SPListItemCollection();
foreach (var list in listCollection)
{
...
foreach (SPListItem listItem in spList.GetItems(qry)){
result.Add(listItem);
}
result.Update();
}
return result;
GetSiteData(query)需要一个SPSiteDataQuery,它是“查询”不是因为我必须使用SPQuery。我只是意识到问题是
SPSiteDataQuery
,正如您在问题中所述,它无法处理UserMulti。
我稍后会看一看,看看是否可以用其他方法实现。将您先前的建议作为灵感,并几乎像您的更新一样解决了它。非常感谢Daniel B:)你知道是否可以通过某种方式访问项目url?当我使用DataTable(然后使用DataRow循环结果时,不能使用SPListItem)。我只能在item.ItemArray中找到一些项属性。也许更明智的做法是将数据表
全部跳过,而是在循环外部创建一个空的SPListItemCollection
,然后在循环内部迭代每个SPListItem
,并将其添加到外部SPListItemCollection
。这样,您可以将项目保留为SPListItems
。这不是答案,但为什么要对常量字符串使用“string.Concat”?