【问题标题】:Linq Where statement is not considering timesLinq Where 语句不考虑时间
【发布时间】: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 进行比较。乔纳森也谢谢你。

标签: c# linq caml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 2023-01-02
    • 2017-11-19
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多