2010-08-21 8 views
15

Estoy usando una vista CalendarItemType para recuperar elementos del calendario. Los únicos elementos que me importan son los que he creado y sé que son todos elementos recurrentes semanales. Puedo obtener cada ocurrencia individual y, a partir de cualquiera de ellos, el elemento maestro recurrente, pero me gustaría reducir el alcance de mi búsqueda a aquellos elementos que coincidan con mi patrón.¿Cómo recupero solo los maestros de eventos recurrentes usando los servicios web de Exchange?

He intentado utilizar la propiedad Restriction en FindItemType para especificar una restricción NotEqualTo con una constante nula para calendarRecurrenceId. Esto causó que mi solicitud expirara. Hasta ahora no he podido cargar las recurrencias con FindItemType en absoluto y necesito utilizar una llamada GetItemType posterior cuando encuentro un evento que es una ocurrencia en una serie recurrente.

Aquí está el código con el que estoy empezando. El código tiene que trabajar tanto con Exchange 2007 y Exchange 2010.

var findItemRequest = new FindItemType(); 

    findItemRequest.ParentFolderIds = new DistinguishedFolderIdType[] 
    { 
     new DistinguishedFolderIdType() 
    }; 

    ((DistinguishedFolderIdType)findItemequest.ParentFolderIds[0]).Id = DistinguishedFolderIdNameType.calendar; 
    findItemRequest.Traversal = ItemQueryTraversalType.Shallow; 

    var itemShapeDefinition = new ItemResponseShapeType(
    { 
     BaseShape = DefaultShapeNamesType.AllProperties; 
    } 

    findItemRequest.Item = calenderView; 
    findItemRequest.ItemShape = itemShapeDefinition; 

    var findItemResponse = this.esb.FindItem(findItemRequest); 

Además, si usted sabe de alguna buena fuente de ejemplos (más allá de los de MSDN), daría la bienvenida a ellos. Estoy recogiendo el código de otra persona en una emergencia y tratando de aprender Exchange Web Services sobre la marcha.

+0

Cuando estaba aprendiendo EWS, utilicé el código de EWSEditor como referencia. – Avilo

Respuesta

4

Quizás te estoy malinterpretando, en cuyo caso me disculpo.

NO utiliza el Calendario - utiliza el IndexedPageItemView normal si todo lo que desea es elementos Master Calendar Recurring.

Utiliza CalendarView para expandir las recurrencias a elementos individuales. Sin embargo, el compromiso con CalendarView es NO se permiten restricciones además de la fecha de inicio y finalización. Ninguna.

+0

¿desea agregar una muestra de código o incluir una referencia? Pude hacer que las cosas funcionaran, pero solo al filtrar las respuestas. Estaba usando el código de otra persona como punto de partida, por lo que comencé con el CalendarItemView (que suena razonable ya que estoy buscando elementos de calendario), pero me gustaría intentar hacerlo a tu manera. – tvanfosson

+1

Me gustaría, pero nuestro código es francamente un poco desordenado. Comenzamos con un hilo de jamming cosas en 50 artículos a la vez (y algunas complicadas/evitan condiciones de carrera que no me gustan). Eso realizó FindItem (idOnly) seguido de getItems. Entonces descubrimos que en Normal IndexedPageView solo recibimos los elementos maestros.Permítanme recomendar THE HOLY GRAIL - está un poco desactualizado (2007 web services), pero es completo, claro, con muchos ejemplos ... – MJB

+0

Es un libro llamado Inside Microsoft Exchange Server 2007 Web Services de Microsoft Press. Y discute MUCHOS casos de esquinas raras de EWS. Todos los equipos de desarrollo deben tener una copia. Dentro de Microsoft® Exchange Server 2007 Web Services por David Sterling; Ben España; Michael Mainer; Mark Taylor; Huw Upshall ---------------------------------------------- ---------------------------------- Editorial: Microsoft Press Fecha de pub: 28 de noviembre de 2007 Imprimir ISBN-10: 0-7356-2392-9 Imprimir ISBN-13: 978-0-7356-2392-7 – MJB

-1

Puede crear filtros de búsqueda personalizados. Si la búsqueda se realiza startdate específica o la propiedad que tiene isRecurring manera más fácil ... (searchItems devuelve los maestros recurrentes)

List<SearchFilter> searchFilterCollection = new List<SearchFilter>(); 

     SearchFilter.IsGreaterThanOrEqualTo startDatumFilter = new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, new DateTime(2012, 9, 16)); 
     SearchFilter.IsEqualTo masterRecurringFilter = new SearchFilter.IsEqualTo(AppointmentSchema.IsRecurring, true); 

     searchFilterCollection.Add(startDatumFilter); 
     searchFilterCollection.Add(masterRecurringFilter); 

     SearchFilter finalFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, searchFilterCollection); 

     ItemView itemView = new ItemView(100000); 
     itemView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, AppointmentSchema.AppointmentType); 

     FindItemsResults<Item> items = _service.FindItems(WellKnownFolderName.Calendar, finalFilter, itemView); 
+0

IsRecurring será falso para los maestros propiedad del organizador. Ver http://msdn.microsoft.com/en-us/library/office/bb204271(v=exchg.150).aspx – Antony

0

encontrado única propiedad que necesita es propiedad RecurrenceStart. Debido a que EWS tiene limitaciones, no es posible usar todas las propiedades en restricción. Este funciona como se esperaba.

Referencia: Find master recurring appointments

0

Usted puede buscar un RecurrenceMaster mediante el uso de la repetición PidLid con un ExtendedPropertyDefinition. Esto funciona porque, según su documentación, "esta propiedad no debe existir en elementos de calendario de instancias únicas".

https://msdn.microsoft.com/en-us/library/cc842017.aspx

// https://msdn.microsoft.com/en-us/library/cc842017.aspx 
ExtendedPropertyDefinition apptType = new ExtendedPropertyDefinition(
    DefaultExtendedPropertySet.Appointment, 
    0x00008216, //PidLidAppointmentRecur 
    MapiPropertyType.Binary); 

var restriction = new SearchFilter.Exists(apptType); 
var iView = new ItemView(10); 
var found = folder.FindItems(restriction, iView); 

Me acaba de confirmar esto funciona, hoy en día, al Revisando un código de edad que trabaja con Office365 EWS en la nube.

Cuestiones relacionadas