1

你好 stackoverflow 社区

我从这个论坛得到了很多帮助。虽然这次我找不到。

我制作了一个 ASP.NET 应用程序,并尝试使用 SharePoint WebService 来获取列表中的一些项目。

到目前为止,我成功地使用 CAML 请求获取了整个列表,但我必须选择 2 个给定日期之间的项目

我在这方面找到了很多帮助,我正在使用这种方法来格式化 ISO 8601 日期字符串:

private string FormatDateForCAML(DateTime theDate)
{
    string result = theDate.ToString("yyyy-MM-ddTHH:mm:ssZ");
    return result;
}

这是 CAML 请求构建:

System.Xml.XmlElement query = xmlDoc.CreateElement("Query");
query.InnerXml = 
        "<Where>"+
            "<And>"+
              "<Geq>"+
                  "<FieldRef Name=\"startdate\" />"+
                  "<Value Type=\"DateTime\" IncludeTimeValue=\"True\">" + theStart + "</Value>" +
              "</Geq>"+
              "<Lt>" +
                  "<FieldRef Name=\"enddate\" />" +
                  "<Value Type=\"DateTime\" IncludeTimeValue=\"True\">" + theEnd+ "</Value>" +
              "</Lt>" +
            "</And>"+
        "</Where>";

此查询没有返回任何错误:

System.Xml.XmlNode nodeListItems = listService.GetListItems(listName, viewName, query, viewFields, rowLimit, queryOptions, null);

但是返回的列表是空的,虽然它不应该

谢谢你的帮助。

编辑:我终于成功了,问题来自一个错误的请求,这里是正确的版本

System.Xml.XmlElement query = xmlDoc.CreateElement("Query");
query.InnerXml = 
        "<Where>"+
            "<And>"+
              "<Geq>"+
                  "<FieldRef Name=\"startdate\" />"+
                  "<Value Type=\"DateTime\" IncludeTimeValue=\"True\">" + theStart + "</Value>" +
              "</Geq>"+
              "<Lt>" +
                  "<FieldRef Name=\"startdate\" />" +
                  "<Value Type=\"DateTime\" IncludeTimeValue=\"True\">" + theEnd+ "</Value>" +
              "</Lt>" +
            "</And>"+
        "</Where>";

感谢 Roqz,我使用了 CAML 查看器,我发现了问题:我只需要比较开始日期!

谢谢你们俩的帮助:)

4

3 回答 3

2

在我的 CAML Builder Tool 中,类似于您的查询确实返回了它应该返回的结果。查询看起来像:

<Query>
    <Where>
        <And>
          <Geq>
            <FieldRef Name="Created" />
            <Value IncludeTimeValue="TRUE" Type="DateTime">2013-04-01T19:35:49Z</Value>                 
          </Geq>
          <Lt>
            <FieldRef Name="Modified" /><Value IncludeTimeValue="TRUE" Type="DateTime">2013-05-24T19:36:46Z</Value>
          </Lt>
        </And>
     </Where>
</Query>

但我记得,如果您想在代码中使用此查询,则不需要周围的标签。您是否检查过您的日期格式是否正确?在您的示例中,最后我看不到“Z”。

于 2013-05-13T15:42:16.233 回答
0

尝试使用完整的 SharePoint 对象模型在控制台应用程序中运行您的 CAML 查询,该模型带有您想要的任何子句,例如您想要过滤日期。如果您的 CAML 在完整的 SharePoint 对象模型中工作,那么它在您尝试使用 SharePoint 本机 Web 服务获取数据时应该也能正常工作。

于 2013-05-13T09:56:20.423 回答
0

我想补充一下这个方法:

private string FormatDateForCAML(DateTime theDate)
{
    string result = theDate.ToString("yyyy-MM-ddTHH:mm:ssZ");
    return result;
}

相当于:

private string FormatDateForCAML(DateTime theDate)
{
    string result = theDate.ToString("s");
    return result;
}

date.ToString("s") 返回一个 ISO.8601 日期格式字符串。

于 2013-05-30T11:33:39.477 回答