按类别筛选Outlook约会

uta*_*ngo 5 c# mapi outlook internationalization outlook-2010

我编写此代码以查找指定时间范围内指定类别的所有约会的总持续时间:

private readonly MAPIFolder _timing;

private int CalculateTotalDuration(DateTime start, DateTime end, string category)
{
    string filter = String.Format(
        "([Start] >= '{0:g}') AND ([End] <= '{1:g}') AND ([Categories] = '{2}')",
        start, end, category);
    return _timing.Items.Restrict(filter).Cast<AppointmentItem>().
        Sum(appt => appt.Duration);
}
Run Code Online (Sandbox Code Playgroud)

当与俄语版本的Outlook一起使用时,此代码会导致以下异常(虽然我没有使用英文版测试它):

System.Runtime.InteropServices.COMException was unhandled
  Message=??????? ???????.
  Source=Microsoft Outlook
  ErrorCode=-2147352567
  StackTrace:
       at Microsoft.Office.Interop.Outlook._Items.Restrict(String Filter)
       ...
Run Code Online (Sandbox Code Playgroud)

当我更换[Categories]使用[?????????],即

string filter = String.Format(
    "([Start] >= '{0:g}') AND ([End] <= '{1:g}') AND ([?????????] = '{2}')",
    start, end, category);
Run Code Online (Sandbox Code Playgroud)

它适用于俄语版的Outlook.但显然它不适用于其他语言.

如何以多语言方式按类别筛选Outlook约会?

Dmi*_*nko 7

尝试使用SQL查询(使用"@ SQL ="作为查询前缀)并使用DASL名称作为类别 - http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Keywords/0x0000101Furn:schemas:mailheader:keywords.


uta*_*ngo 5

我想出了以下适用于我的DASL过滤器:

var filter = String.Format(
    "@SQL=(\"urn:schemas:calendar:dtstart\" >= '{0:g}' " +
    "AND \"urn:schemas:calendar:dtend\" <= '{1:g}' " +
    "AND \"urn:schemas-microsoft-com:office:office#Keywords\" LIKE '%{2}%')",
    start, end, category);
Run Code Online (Sandbox Code Playgroud)

实际上我使用DASL查询构建器构建它:

QueryBuilder的

为了显示我创建了一个查询生成器选项卡的QueryBuilder键在HKEY_CURRENT_USER \软件\微软\办公室\ 14.0\Outlook中所描述这里.

感谢德米特里建议使用DASL.