none
Linq to SharePoint (2013). DateTime. IncludeTimeValue. RRS feed

  • Вопрос

  • Здравствуйте. Хотелось бы напомнить о проблеме, которая существует уже достаточно давно. Самое смешное, что ее исправление - это, ну прямо скажем, не самое долгое и обременяющее занятие. Подробности здесь http://philippov.wordpress.com/2010/08/12/linq-2-sharepoint-datetime-problem/   .

    От себя хочу добавить, что проблема так и осталась в 2013 SharePoint. И код вида:

    var tasks = from t in this.CurrentContext.InspectionTasks
                            where t.DueDate < DateTime.Now 
                            select t;

    Генерирует следующий запрос:

    <Where><Lt><FieldRef Name="DueDate" IncludeTimeValue="TRUE" /><Value Type="DateTime">2013-08-22T18:56:03Z</Value></Lt></Where>
    IncludeTimeValue="TRUE" - для учета времени в запросе, этот аттрибут необходим в элементе Value. Честно говоря, когда я столкнулся с этим, то был несколько удивлен. Еще больше я удивился когда узнал, что эта проблема не новая.
    22 августа 2013 г. 15:05

Ответы

  • Тогда попробуйте две ступени:

    var now = DateTime.Now;

    var eod = now.Date.AddDays(1);

    var dueToday = (from t in this.CurrentContext.InspectionTasks where t.DueDate < eod select t).ToList();

    var tasks = from t in dueToday
                            where t.DueDate < now
                            select t;

    Первая выберет все задачи с сегодняшней датой окончания, вторая локально отфильтрует все лишнее. В этом случае число "лишних" элементов будет минимально. 

    Если надо добавьте проверку на null.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    23 августа 2013 г. 16:12

Все ответы

  • Попробуйте так:

    var tasks = from t in this.CurrentContext.InspectionTasks
                            where t.DueDate.Ticks < DateTime.Now.Ticks
                            select t;


    This posting is provided "AS IS" with no warranties, and confers no rights.

    22 августа 2013 г. 17:55
  • Попробуйте так:

    var tasks = from t in this.CurrentContext.InspectionTasks
                            where t.DueDate.Ticks < DateTime.Now.Ticks
                            select t;

    Илья, спасибо. К сожалению этот вариант не приемлем абсолютно. Тип поля System.Nullable<System.DateTime> (на всякий случай укажу это).

    Выражение вида:

    from t in this.CurrentContext.InspectionTasks
                            where t.DueDate.Value < DateTime.Now
                            select t;

    Генерирует следующий CAML-запрос:

    <Query><Where><Lt><FieldRef Name="DueDate" IncludeTimeValue="TRUE" /><Value Type="DateTime">2013-08-23T12:38:08Z</Value></Lt></Where></Query>

    Запрос корректен, за исключением одного атрибута.

    Ваш вариант:

    from t in this.CurrentContext.InspectionTasks
                            where t.DueDate.Value.Ticks < DateTime.Now.Ticks
                            select t;

    Генерирует следующий CAML-запрос:

    <Query></Query>

    Как видите, ничего он не генерирует вообще. Из списка будут выбраны все элементы, а затем уже с помощью linq to objects произойдет фильтрация.

    Либо я что-то не так делаю.

    23 августа 2013 г. 8:45
  • Тогда попробуйте две ступени:

    var now = DateTime.Now;

    var eod = now.Date.AddDays(1);

    var dueToday = (from t in this.CurrentContext.InspectionTasks where t.DueDate < eod select t).ToList();

    var tasks = from t in dueToday
                            where t.DueDate < now
                            select t;

    Первая выберет все задачи с сегодняшней датой окончания, вторая локально отфильтрует все лишнее. В этом случае число "лишних" элементов будет минимально. 

    Если надо добавьте проверку на null.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    23 августа 2013 г. 16:12
  • Илья, спасибо за ответы. Да, второй вариант более приемлем, но все же хотелось бы, чтобы эту досадную ошибку в linq to sharepoint исправили наконец-таки. В моем случае, в конкретном данном месте я отказался от использования linq to sharepoint и обошелся выборкой непосредственно CAML-запросом.
    26 августа 2013 г. 8:44
  • Исправление ошибок далеко не так просто как кажется на первый взгляд. Даже изменение одной буквы влечет за собой целый ряд куда более сложных и дорогостоящих мероприятий как например тестирование всего продукта на предмет регрессий, локализацию, проверку геополитики, подготовка и проверка публикации и многое другое. 

    Кроме того всегда есть другие проблемы требующие решения и для любой ошибки всегда есть приоритет.

    В данном случае он очень низок так как:

    - Это не проблема безопасности.

    - Проблема затрагивает минимальное число пользователей.

    - Имеется несколько легких и эффективных способов обойти проблему.

    Поэтому данная ошибка скорее всего где то в самом конце списка на исправление.

    Конечно хотелось бы чтоб ее (и все другие) ошибки исправили, но желания, увы, далеко не всегда совпадают с реалиями жизни. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    26 августа 2013 г. 20:19
  • Исправление ошибок далеко не так просто как кажется на первый взгляд. Даже изменение одной буквы влечет за собой целый ряд куда более сложных и дорогостоящих мероприятий как например тестирование всего продукта на предмет регрессий, локализацию, проверку геополитики, подготовка и проверка публикации и многое другое. 

    Я, конечно, все это понимаю и все такое. Но все же исправление, заключающееся в

    if (field.FieldType == SPDataFieldType.DateTime) 
    { 
      xwriter.WriteAttributeString("IncludeTimeValue", "TRUE"); 
    } 

    которое, грубо говоря, добавляет в текстовую строку несколько слов и символов. Которое уже несколько лет, на протяжении выпуска двух продуктов, не могут исправить - это уже перебор. Про сложности с тестированием в данном случае не стоит все-таки преувеличивать.

    В данном случае он очень низок так как:

    - Это не проблема безопасности.

    - Проблема затрагивает минимальное число пользователей.

    - Имеется несколько легких и эффективных способов обойти проблему.

    Это с одной стороны. А с другой - вот у меня репозитории, сущности, наследование, интерфейсы, юнит оф ворки и прочая радость. Но я не могу все это использовать так как надо, потому что в определенных, достаточно банальных ситуациях, linq to sharepoint косячит, либо просто не может что-то сделать. В итоге кусками получается так, кусками по-другому. А самое печальное, что linq to sharepoint получается, вроде как, и не нужен вообще (какой-то красивой, но недоделанной игрушкой он выглядит) - потому что без него можно сделать что угодно, а с ним далеко не все.
    27 августа 2013 г. 8:14
  • Не думаю что вы действительно понимайте как работает процесс выпуска исправлений в больших проектах.

    Но в данном случе все это не имеет значения так как речь идет не о продукте Микрософт, а о продукте с открытым кодом:

    http://linqtosharepoint.codeplex.com/

    Судя по всему проект так и не вышел из рамок альфы и, похоже, мертв уже несколько лет. 

    Или вы используйте что то другое?


    This posting is provided "AS IS" with no warranties, and confers no rights.

    28 августа 2013 г. 21:48
  • Не думаю что вы действительно понимайте как работает процесс выпуска исправлений в больших проектах.

    Но в данном случе все это не имеет значения так как речь идет не о продукте Микрософт, а о продукте с открытым кодом:

    http://linqtosharepoint.codeplex.com/

    Судя по всему проект так и не вышел из рамок альфы и, похоже, мертв уже несколько лет. 

    Или вы используйте что то другое?


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Не думаю, что вы действительно понимаете о чем мы вообще разговариваем). Я немного знаком, хотя, конечно, не с таким уровнем.

    В данном случае это еще как имеет значение. Потому что использую я то, что как раз выпускает и поддерживает Microsoft (http://msdn.microsoft.com/ru-ru/library/ee537339(v=office.14).aspx). Тот продукт с открытым кодом - это альфа для 2007 и речь не о нем. Вообще, если интересно о чем мы тут разговаривали, то посмотрите в гугле "linq to sharepoint", но только для 2010 и 2013 версий.

    Честно говоря, я несколько удивлен (мягко говоря) вашим последним сообщением.

    29 августа 2013 г. 9:04