После объединения информации из множества разных источников - ни один из которых не касался точных обстоятельств моей проблемы, я пришел к следующему выводу:
При запросе данных SharePoint с использованием объектной модели SharePoint и языка разметки приложений (CAML) SharePoint по умолчанию не использует компонент времени элементов DateTime при выполнении сравнений. Чтобы указать SharePoint использовать компонент времени, необходимо включить свойство IncludeTimeValue = 'TRUE' в тип значения, как показано здесь:
<Where>
<Eq>
<FieldRef Name='Begins' />
<Value Type='DateTime' IncludeTimeValue='TRUE'>
2008-03-24T12:00:00Z
</Value>
</Eq>
</Where>
Я нашел несколько сообщений в блоге, в которых упоминалась ошибка в LINQ to SharePoint, из-за которой сгенерированный CAML выводился в виде:
<Where>
<Eq>
<FieldRef Name='dateTimeField' IncludeTimeValue='TRUE' />
<Value Type='DateTime'>
2008-03-24T12:00:00Z
</Value>
</Eq>
</Where>
Обратите внимание, что IncludeTimeValue = 'TRUE' находится в элементе FieldRef вместо элемента Value. Поскольку это не подходящее место для этого свойства, все запросы LINQ to SharePoint, которые выполняют сравнения по времени и дате, сравниваются только с компонентом даты.
Поскольку я вижу такое же поведение при использовании LINQ и WCF Data Services для подключения к SharePoint, я могу только предположить, что под прикрытием LINQ / WCF Data Services выдает тот же недопустимый CAML.
Решение (при условии, что я все еще хочу использовать LINQ / WCF Data Services) состоит в том, чтобы выполнить два запроса (как указано в исходном вопросе). Первый запрос LINQ извлекает данные списка из SharePoint и сохраняет их в списке. Второй запрос LINQ обрабатывает сравнения дат, чтобы получить только те данные, которые мне нужны.
Поскольку в моих конкретных обстоятельствах у меня может быть много записей в списке SharePoint, охватывающих большой промежуток времени, но меня будут интересовать записи только в определенный день или пару дней, я хотел найти способ не возвращать весь список в первом запросе.
Я остановился на сравнении <= и> =, чтобы приблизиться, а затем еще больше ограничил это во втором запросе. Итак, два моих запроса теперь стали:
DateTime RightNow = DateTime.Now;
var query = (from a in context.Alerts
where (a.Begins <= RightNow) && (a.Expires >= RightNow)
select a).ToList();
var query2 = from q in query
where q.Begins < RightNow) && (a.Expires > RightNow)
select q;
Первое выражение LINQ вернет все элементы, которые меня в конечном итоге интересуют; наряду с некоторыми, что я не (потому что он сравнивает только компонент даты datetime). Второе утверждение LINQ еще больше урежет это до тех, которые меня интересуют.