【发布时间】:2019-04-13 15:13:01
【问题描述】:
我想从 SharePoint 的列表中获取所有项目,但非常特殊的情况除外。目前,我正在使用 CAML 查询获取所有内容,然后使用 LINQ WHERE 语句将它们从列表中删除。 Suspense 字段是从 SharePoint 中提取的日期(基本上是到期日期),而 Closure 是用户添加关闭信息的简单文本字段。如果悬念日期/时间早于当前日期/时间,并且闭包字段没有输入(null),我希望它们从我的查询中排除。
我无法使用纯 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 中选择所有!(暂停日期在当前日期之前 && 闭包不为空)
我的 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);
编辑:我发现我的 Suspense 日期来自 UTC 格式的 Sharepoint,而我的 c# DateTime.Now 是本地的。这会导致问题吗?
【问题讨论】:
-
您确定
Suspense是一个完整的日期时间字段,而不仅仅是日期吗?这些值是以 UTC 时间还是本地时间返回的?您可能需要转换 -
悬念是日期和时间。它来自 SharePoint,如下所示:
Date(041220190240)但我正在使用上面的ListItemExt.GetDateTime(x, "Suspense")转换为 DateTime。该函数将其转换为日期时间:return item[key] as DateTime? -
suspense的格式是UTC,需要转成本地吗?
-
或与
DateTime.UtcNow比较 -
谢谢@Henk,这解决了我的问题。尤其使用 DateTime.UtcNow 进行比较。乔纳森也谢谢你。