2012-08-17 26 views
11

साथ पेजिंग कैसे करना है मैं ऐसा करते हैं तो:Exchange वेब सेवाओं CalendarView

_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 के साथ कोई पेजिंग कैसे करता है?

मैं तिथि सीमा एक छोटी सी अवधि होने के लिए कम हो सकता है, लेकिन अभी भी अगर यह यकीन है कि के लिए काम करेगा का निर्धारण करने का कोई रास्ता नहीं है।

उत्तर

8

CalendarView वास्तव में PagedView से नहीं लिया गया है, इसलिए आपके द्वारा अपेक्षित सभी पेजिंग तर्क संभव नहीं हैं। MaxItemsReturned पृष्ठ आकार की तुलना में ऊपरी सीमा से अधिक है। लौटाई गई त्रुटि PagedView व्युत्पन्न दृश्य प्रकारों के लिए अधिक प्रासंगिक है।

मैंने कुछ पावरशेल के साथ खेले गए अंतिम आइटम के आधार पर कैलेंडरव्यू विंडो को रोल करके अनुक्रमित करने के लिए कुछ पावरशेल के साथ खेला, लेकिन दुर्भाग्यवश कैलेंडरव्यू और अपॉइंटमेंट विस्तार के पीछे तर्क आपको जो चाहिए उसे प्राप्त करना असंभव बना देता है। मूल रूप से यह विस्तार करता है, यह "एन" वस्तुओं पर रुकने जा रहा है, लेकिन आपके पास एक से अधिक नियुक्तियां हो सकती हैं जो एक ही समय में शुरू होती हैं और यह आपको एक दे सकती है, लेकिन शेष नहीं। साथ ही, विंडो को ओवरलैप करने वाली किसी भी अपॉइंटमेंट को शामिल किया जाएगा, इसलिए नीचे कोड एक अनंत लूप में जाएगा यदि आपके पास कैलेंडर पर 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)" 

दुर्भाग्य से विस्तार और ओवरलैप तर्क मतलब आप डुप्लिकेट इस तरह से मिल जाएगा, पहले से परे प्रत्येक कॉल के लिए कम से कम एक डुप्लिकेट।

यदि मुझे कैलेंडरव्यू का उपयोग करके कोड लिखना पड़ा, तो शायद मैं मैक्सआईटम्स 1000 का पुन: उपयोग करूँगा (यह भी सीमा है जो आपको त्रुटि स्थिति में फेंक देती है यदि आप MaxItemsReturned निर्दिष्ट नहीं करते हैं)। यदि आप उन्हें सभी एक कॉल में प्राप्त करते हैं, तो आप अच्छे हैं। यदि आपको दूसरा कॉल करना है, तो आपको परिणाम सेट को समर्पित करने के लिए कुछ अतिरिक्त कार्य करना होगा। मैं कैलेंडरव्यू में जितनी संभव हो सके डेट विंडो की संकीर्णता के रूप में सर्वर पर बोझ को सीमित करने का प्रयास करता हूं क्योंकि आप एक्सचेंज से पूरे समय अवधि में पुनरावर्ती नियुक्तियों के विस्तार की गणना करने के लिए कह रहे हैं। यह सर्वर के लिए काफी महंगी ऑपरेशन हो सकता है।

+0

अच्छी चीजें रिक, लेकिन अभी भी मेरे लिए पर्याप्त निर्धारक नहीं है। इस दौरान मैंने जो किया है वह महीनों में अवधि को तोड़ देता है और प्रत्येक महीने के लिए 'कैलेंडरव्यू' का उपयोग करता है। ठीक काम करने लगता है। – tig

+0

'सर्वर प्रसंस्करण लागत' मूल रूप से वही है चाहे मैं इसे पूर्ण वर्ष या 12 महीने लंबी श्रेणियों के साथ करता हूं, नहीं? – tig

+0

भले ही आपकी प्रतिक्रिया वास्तव में मेरी समस्या का समाधान नहीं करती है, आप एक उत्तर प्रदान करते हैं: कैलेंडर के साथ PagedmView शैली पेजिंग करना संभव नहीं है। तो इसे उत्तर के रूप में चिह्नित करें। – tig

0

आप नियुक्तियों क्वेरी करने के लिए 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; 
} 
+3

यह पुनरावर्ती स्वामी की घटनाओं का विस्तार नहीं करता है और इस प्रकार कैलेंडर का अपूर्ण दृश्य प्रदान करता है जहां तक ​​मैं कह सकता हूं। यही कारण है कि 'कैलेंडर दृश्य' इतना उपयोगी है (इस तथ्य को छोड़कर कि यह पृष्ठ अच्छी तरह से नहीं है) – jessehouwing

0

तुम अब भी 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); 
} 

हालांकि मुझे नहीं पता कि वे क्रम में आते हैं या नहीं। यदि वे नहीं करते हैं तो आपको अंतिम तिथि की शुरुआत तिथि का उपयोग करना होगा और डुप्लिकेट को हटा देना होगा।