Linq Where 语句不考虑时间
Linq Where statement is not considering times
我想从 SharePoint 的列表中获取所有项目,非常特殊的情况除外。目前,我正在使用 CAML 查询获取所有内容,然后使用 LINQ WHERE 语句将它们从列表中删除。 Suspense 字段是从 SharePoint 中提取的日期(基本上是到期日期),Closure 是一个简单的文本字段,用户可以在其中添加结束信息。如果悬念 date/time 在当前 date/time 之前,并且闭包字段没有输入(null),我希望它们从我的查询中排除。
我无法使用纯 CAML 查询获得我想要的结果,所以我抓取了所有内容,然后尝试使用 LINQ 对其进行过滤。
CAML 查询:
<View><Query><OrderBy><FieldRef Name='Suspense' /></OrderBy></Query></View>
LINQ(我想在 CAML 查询中做什么):
.Where(x => !(x.Suspense < DateTime.Now && x.Closure != null))
我想 select 全部来自 sp-list where !(Suspense date is before the current date && Closure is not 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);
编辑:我发现我的 Suspense 日期来自 Sharepoint 的 UTC 格式,而我的 c# DateTime.Now 是本地的。这会导致问题吗?
Sharepoint CSOM 字段以 UTC 形式出现。我使用 DateTime.Now
,切换到 DateTime.UtcNow
解决了我的问题。谢谢@Henk
我想从 SharePoint 的列表中获取所有项目,非常特殊的情况除外。目前,我正在使用 CAML 查询获取所有内容,然后使用 LINQ WHERE 语句将它们从列表中删除。 Suspense 字段是从 SharePoint 中提取的日期(基本上是到期日期),Closure 是一个简单的文本字段,用户可以在其中添加结束信息。如果悬念 date/time 在当前 date/time 之前,并且闭包字段没有输入(null),我希望它们从我的查询中排除。
我无法使用纯 CAML 查询获得我想要的结果,所以我抓取了所有内容,然后尝试使用 LINQ 对其进行过滤。 CAML 查询:
<View><Query><OrderBy><FieldRef Name='Suspense' /></OrderBy></Query></View>
LINQ(我想在 CAML 查询中做什么):
.Where(x => !(x.Suspense < DateTime.Now && x.Closure != null))
我想 select 全部来自 sp-list where !(Suspense date is before the current date && Closure is not 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);
编辑:我发现我的 Suspense 日期来自 Sharepoint 的 UTC 格式,而我的 c# DateTime.Now 是本地的。这会导致问题吗?
Sharepoint CSOM 字段以 UTC 形式出现。我使用 DateTime.Now
,切换到 DateTime.UtcNow
解决了我的问题。谢谢@Henk