如果我这样做:
_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
?
我可以缩小日期范围是更短的跨度,但仍然无法确定它是否会为确保工作的方式。
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的日期窗口尽可能的限制服务器的负担。 它可以是服务器相当昂贵的操作。
您可以使用ItemView
和SearchFilter
查询预约:
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;
}
您仍然可以在分页功能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起始日期和删除重复。