1

Exchange からカレンダー アイテムを読み取り、各ユーザーに対してアプリケーションの DB に格納する Windows サービスがあります。Exchange 上のアイテムを保存した後、次のサービス実行で取得されないようにするにはどうすればよいでしょうか?

拡張プロパティを予定表アイテムに追加してその値を設定し、毎回その値に基づいて検索しようとしました:

DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(60);
const int NUM_APPTS = 60;    
// Set the start and end time and number of appointments to retrieve.
CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);

Guid myPropertyId = new Guid("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}");
ExtendedPropertyDefinition myExtendedProperty = new ExtendedPropertyDefinition(myPropertyId, "SyncFlag", MapiPropertyType.Boolean);

// Limit the properties returned to the appointment's subject, start time, end time and the extended property.
 cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End, AppointmentSchema.Location, myExtendedProperty);

// Retrieve a collection of appointments by using the calendar view.
List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
searchFilterCollection.Add(new SearchFilter.IsEqualTo(AppointmentSchema.Start, DateTime.Now));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(AppointmentSchema.End, DateTime.Now.AddDays(60)));

searchFilterCollection.Add(new SearchFilter.IsNotEqualTo(myExtendedProperty, true)); //Do not fetch already marked calendar items

SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection);

FindItemsResults<Item> appointments = service.FindItems(WellKnownFolderName.Calendar, searchFilter, cView);

このコードを使用して予定表アイテムを検索すると、次の例外がスローされます。

CalendarView には、制限と並べ替え順序を指定できない場合があります。

また、それが最善の方法であるかどうかもわかりません。何か案が?

ありがとう

4

1 に答える 1

2

これを行う 1 つの方法は、メソッドを使用するSyncFolderItemsことです。最後の呼び出し以降に変更されたアイテムを返します。各呼び出しの間に同期「Cookie」を保存するだけです。

また、最後の通話以降に作成された予定項目を除外する必要があります。

以下のコード スニペットでうまくいくはずです。

static private void GetChangedItems()
{
    // Path to cookie
    string syncStateFileName = @"c:\temp\ewssyncstate.txt";

    try
    {
        var service = GetServiceAP();
        bool moreChangesAvailable = false;

        do
        {
            string syncState = null;


            if (File.Exists(syncStateFileName))
            {
                // Read cookie
                syncState = File.ReadAllText(syncStateFileName);
            }

            ChangeCollection<ItemChange> icc = service.SyncFolderItems(new FolderId(WellKnownFolderName.Calendar), PropertySet.FirstClassProperties, null, 10, SyncFolderItemsScope.NormalItems, syncState);

            if (icc.Count == 0)
            {
                Console.WriteLine("There are no item changes to synchronize.");
            }
            else
            {
                syncState = icc.SyncState;

                // Save cookie
                File.WriteAllText(syncStateFileName, syncState);

                moreChangesAvailable = icc.MoreChangesAvailable;

                // Only get appointments that were created since last call
                var createdItems = icc
                    .Where(i => i.ChangeType == ChangeType.Create)
                    .Select(i => i.Item as Appointment)
                    ;

                if (createdItems.Any())
                {
                    service.LoadPropertiesForItems(createdItems, PropertySet.FirstClassProperties);

                    foreach (Appointment appointment in createdItems)
                    {
                        Console.WriteLine(appointment.Subject);
                    }
                }
            }
        }
        while (moreChangesAvailable);

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}
于 2015-12-16T17:12:58.200 に答える