除了非常特殊的情况外,我想从SharePoint中的列表中获取所有项目。目前,我正在使用CAML查询来获取所有内容,然后使用LINQ WHERE语句将它们从列表中删除。 Suspense字段是从SharePoint中提取的日期(基本上是到期日期),而Closure是一个简单的Text字段,用户可以向其中添加关闭信息。如果暂挂日期/时间早于当前日期/时间,并且关闭字段没有输入(空),则希望将其从查询中排除。
我无法使用纯CAML查询获得所需的结果,因此我抓住了所有内容,然后尝试使用LINQ对其进行过滤。 CAML查询:
<View><Query><OrderBy><FieldRef Name='Suspense' /></OrderBy></Query></View>
LINQ(我想在CAML查询中做什么):
.Where(x => !(x.Suspense < DateTime.Now && x.Closure != null))
我想从所有的sp-list中选择所有内容!(暂停日期在当前日期之前&&闭包不为null)
我的linq查询没有考虑时间,只考虑了日期。如果我运行查询时,任务的日期是今天的悬而未决,但仍是今天早些时候的时间,则该查询仍会显示在我的结果中。
完整代码块(我的XML被剥离了,但是您可以在上面看到查询):
//获取操作项
var query = new CamlQuery() { ViewXml = "<View><Query><OrderBy><FieldRef Name='Suspense' /></OrderBy></Query></View>" };
var actionItems = actionsList.GetItems(query);
context.Load(actionItems);
context.ExecuteQuery();
actions = actionItems.AsEnumerable()
.Select(x => new Models.Action()
{
Id = x.Id,
ItemNum = ListItemExt.GetInt32(x, "ID"),
WhoLead = ListItemExt.GetUser(x, "Who_x0020_L_x002d_Lead"),
WhoSupport = ListItemExt.GetUser(x, "Who_x0020_S_x002d_Spt"),
What = ListItemExt.GetString(x, "Title"),
Suspense = ListItemExt.GetDateTime(x, "Suspense"),
Closure = ListItemExt.GetString(x, "Closure")
}).Where(x => !(x.Suspense < DateTime.Now && x.Closure != null)).ToList();
lastModified = actionsList.LastItemModifiedDate;
}
return Json(new { Actions = actions, LastModified = lastModified}, JsonRequestBehavior.AllowGet);
编辑:我发现我的暂挂日期来自UTC格式的Sharepoint,而我的c#DateTime.Now是本地的。这会导致问题吗?
答案 0 :(得分:2)
SharePoint CSOM字段以UTC的形式出现。我正在使用DateTime.Now
,切换到DateTime.UtcNow
可以解决我的问题。谢谢@Henk