如何做分页与Exchange Web服务CalendarView(How to do paging

2019-07-31 01:53发布

如果我这样做:

_calendar = (CalendarFolder)Folder.Bind(_service, WellKnownFolderName.Calendar);

var findResults = _calendar.FindAppointments(
    new CalendarView(startDate.Date, endDate.Date)
);

我有时会收到所发现的项目太多异常。

“你已经超过了可为查找操作返回的对象的最大数量。使用分页功能,以减少结果的大小,然后再次尝试您的请求。”

CalendarView支持一个构造函数,可以让我指定MaxItemsReturned ,但我想不通我怎么会再次调用它,指定offset分页。 ItemView具有此构造函数:

 public ItemView(int pageSize, int offset)

的,这个用法是显而易见的。

什么CalendarView ? 一个人如何做分页用CalendarView

我可以缩小日期范围是更短的跨度,但仍然无法确定它是否会为确保工作的方式。

Answer 1:

CalendarView实际上并没有从衍生PagedView ,所以所有的分页逻辑的,你想到的是不可能的。 MaxItemsReturned更多的上限比页面大小。 所返回的错误是更相关的PagedView派生视图类型。

我打得四处一些PowerShell的滚动基础上,最后一个项目的CalendarView窗口返回模拟寻呼,但不幸的是,CalendarView及委任扩张背后的逻辑,使其不可能得到正是你需要的。 基本上,因为它的扩展,它会停在“N”项,但你可能有不止一个约会开始在完全相同的时间,它可能会给你一个,但不能休息。 此外,重叠的窗口的任何任命将得到包括在内,所以下面的代码将进入一个无限循环,如果你有日历,所有具有相同的开始时间50个约会。

Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
$cred = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials ($user , $passwd)
$service.UseDefaultCredentials = $false
$service.Credentials = $cred
$service.AutodiscoverUrl($user)

$num=50
$total=0
$propsetfc = [Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties
$calfolder = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar

$service.UserAgent = "EWSCalViewTest"
$calview = New-Object Microsoft.Exchange.WebServices.Data.CalendarView("1/1/2012","12/31/2012", $num)
$calview.PropertySet = $propsetfc

do {
    $findresults = $service.FindAppointments($calfolder,$calview)
    write-host  "Found:" $findresults.Items.Count "of" $findresults.TotalCount
    $calview.StartDate = $findresults.Items[$findresults.Items.Count-1].Start
    $total+=$findresults.Items.Count
} while($findresults.MoreAvailable)
write-host $total "total found (including dups)"

不幸的是,扩大和重叠的逻辑意味着你会得到重复这样,超越了第一每次通话至少一个副本。

如果让我用CalendarView写代码,我可能会使用1000 MaxItemsReturned(这也是全你到错误情况,如果你不指定MaxItemsReturned的限制)。 如果你让他们都在同一个电话,你是好。 如果你有拨打第二个电话,那么你就必须做一些额外的工作,去重复的结果集。 我也想尝试,因为你问交换来计算整个时间跨度定期约会的扩展使用窄的CalendarView的日期窗口尽可能的限制服务器的负担。 它可以是服务器相当昂贵的操作。



Answer 2:

您可以使用ItemViewSearchFilter查询预约:

var itemView = new ItemView(100, 0);
itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly,
    ItemSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);

var filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And,
    new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "IPM.Appointment"),
    new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, startDate),
    new SearchFilter.IsLessThan(AppointmentSchema.Start, endDate));

bool moreAvailable = true;
while (moreAvailable)
{
    var result = _service.FindItems(WellKnownFolderName.Calendar, filter, itemView);

    foreach (var appointment in result.OfType<Appointment>())
    {
        DateTime start = appointment.Start;
        DateTime end = appointment.End;
        string subject = appointment.Subject;

        // ...
    }

    itemView.Offset += itemView.PageSize;
    moreAvailable = result.MoreAvailable;
}


Answer 3:

您仍然可以在分页功能FindAppointments操纵CalendarView开始日期。

var cal = CalendarFolder.Bind(_service, WellKnownFolderName.Calendar);
var cv = new CalendarView(start, end, 1000);

var appointments = new List<Appointment>();

var result = cal.FindAppointments(cv);

appointments.AddRange(result);

while (result.MoreAvailable)
{
     cv.StartDate = appointments.Last().Start;

     result = cal.FindAppointments(cv);

     appointments.AddRange(result);
}

虽然我不知道,如果他们在秩序。 如果他们不,您可能需要使用最后envent起始日期和删除重复。



文章来源: How to do paging with Exchange Web Services CalendarView