Linq Where语句未考虑时间

时间:2019-04-12 19:20:45

标签: c# linq caml

除了非常特殊的情况外,我想从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是本地的。这会导致问题吗?

1 个答案:

答案 0 :(得分:2)

SharePoint CSOM字段以UTC的形式出现。我正在使用DateTime.Now,切换到DateTime.UtcNow可以解决我的问题。谢谢@Henk