C# 在sharepoint中查询多个任务列表

C# 在sharepoint中查询多个任务列表,c#,sharepoint,C#,Sharepoint,我正在尝试使用以下工具查询SharePoint中的多个任务列表: SPSiteDataQuery query = new SPSiteDataQuery(); query.Lists = "<Lists ServerTemplate=\"171\" />"; query.Query = string.Concat("<Where>", "<Neq>",

我正在尝试使用以下工具查询SharePoint中的多个任务列表:

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”?