Linq, где заявление не рассматривает раз - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу получить все элементы из списка в SharePoint, за исключением очень специфической ситуации. В настоящее время я собираю все с помощью CAML Query, затем удаляю их из списка с помощью оператора LINQ WHERE. Поле Suspense - это дата, извлекаемая из SharePoint (в основном, срок действия), а Closure - это простое текстовое поле, к которому пользователи добавляют закрывающую информацию. Если дата / время ожидания предшествуют текущей дате / времени, а поле закрытия не имеет ввода (пусто), я хочу, чтобы они были исключены из моего запроса.

Я не смог получить желаемые результаты, используя чистый CAML-запрос, поэтому я собрал все, а затем попытался отфильтровать его с помощью LINQ. CAML-запрос:

<View><Query><OrderBy><FieldRef Name='Suspense' /></OrderBy></Query></View>

LINQ (что я хочу сделать в CAML Query):

.Where(x => !(x.Suspense < DateTime.Now && x.Closure != null)) Я хочу выбрать все из sp-списка, где! (Дата приостановки раньше текущей даты && Закрытие не равно нулю)

Мой запрос linq не учитывает время, а только дату. Если я выполняю запрос, имея задачу с датой ожидания сегодня, но с более ранним днем ​​сегодня, он все равно отображается в моих результатах.

Блок полного кода (My 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);

РЕДАКТИРОВАТЬ: я обнаружил, что моя дата приостановки поступает из Sharepoint в формате UTC, в то время как мой c # DateTime.Now является локальным. Может ли это вызвать проблему?

1 Ответ

2 голосов
/ 12 апреля 2019

Поля CSOM Sharepoint отображаются как UTC. Я использовал DateTime.Now, переключение на DateTime.UtcNow устранило мою проблему. Спасибо @ Хенк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...