Странное поведение Outlook.Items Restrict()

Я просто хочу фильтровать свои письма с помощью Restrict-Method следующим образом:

            restriction += "[ReceivedTime] < '" + ((DateTime)time).ToString("yyyy-MM-dd HH:mm") + "'";
            var count = oFolder.Items.Restrict(restriction).Count;//Cast<object>().ToList();
            for (int i = 0; i < count; i++)
            {
                var crntReceivedTime = ((OutLook.MailItem)oFolder.Items.Restrict(restriction).Cast<object>().ToList()[i]).ReceivedTime;
                if (crntReceivedTime > time)
                {
                    string t = "";
                }
            }

Теоретически строка string t = ""; никогда не должна вызываться, потому что я определил, что элементы никогда не будут иметь записей, значение ReceivedTime которых больше, чем time. Проблема в том, что строка вызывается, что означает, что коллекция ограниченных элементов содержит записи, которые не должны содержаться.

Я что-то не так сделал или метод Restrict() просто не работает?


person Florian Gl    schedule 12.06.2013    source источник


Ответы (1)


Во-первых, вы используете многоточечную нотацию. Вы вызываете Restrict (который стоит дорого, даже если он вызывается один раз) на каждом шаге цикла. Вызовите его один раз, кэшируйте возвращенную (ограниченную) коллекцию Items, а затем выполните цикл по элементам в этой коллекции.

Во-вторых, что такое полное ограничение? Вы используете +=, чтобы добавить дополнительное ограничение на ReceivedTime. Каково фактическое значение переменной ограничения?

Изменить: у меня не возникло проблем со следующим скриптом, выполненным из OutlookSpy (нажмите кнопку "Скрипт", вставьте скрипт, нажмите Выполнить):

restriction = " [ReceivedTime] < '2011-06-11 00:00' "
set Folder = Application.ActiveExplorer.CurrentFolder
set restrItems = Folder.Items.Restrict(restriction)
for each item in restrItems
  if TypeName(item) = "MailItem" Then
    Debug.Print item.ReceivedTime & " - " & item.Subject
  End If
next
person Dmitry Streblechenko    schedule 12.06.2013
comment
К вашему первому замечанию: это было только для целей тестирования (весь цикл for), поэтому я использую способ с наименьшим количеством кода. Второй момент: это полное ограничение, я планирую добавить больше ограничений, поэтому я начинаю с restriction = ""; и продолжаю добавлять больше. Но пока эта первая строка — все ограничение. - person Florian Gl; 13.06.2013
comment
Итак, какова была дата ограничения и какое значение ReceivedTime не соответствовало ограничению, но тем не менее было возвращено? - person Dmitry Streblechenko; 13.06.2013
comment
Дата ограничения была 2013-06-11 00:00, ReceivedTime была 2013-11-11 11:39. - person Florian Gl; 13.06.2013
comment
2013-11-11 — дата из будущего. Вы уверены, что у вас есть правильное значение? У меня не было проблем с запуском сценария выше из OutlookSpy. Также обратите внимание, что Outlook использует локальный формат даты/времени для даты, поэтому вы можете получить dd-MM вместо MM-dd. - person Dmitry Streblechenko; 13.06.2013
comment
Извините, обе даты были 2012, а не 2013. Спасибо, изменение MM-dd на dd-MM помогло. - person Florian Gl; 13.06.2013