按类别筛选Outlook约会

时间:2013-01-03 05:20:29

标签: c# internationalization outlook outlook-2010 mapi

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

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);
}

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

System.Runtime.InteropServices.COMException was unhandled
  Message=Условие неверно.
  Source=Microsoft Outlook
  ErrorCode=-2147352567
  StackTrace:
       at Microsoft.Office.Interop.Outlook._Items.Restrict(String Filter)
       ...

当我用[Categories]替换[Категории]时,即

string filter = String.Format(
    "([Start] >= '{0:g}') AND ([End] <= '{1:g}') AND ([Категории] = '{2}')",
    start, end, category);

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

如何按多种语言按类别过滤Outlook约会?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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);

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

QueryBuilder

要显示“查询生成器”标签,我已按照here所述在 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Outlook 中创建 QueryBuilder 键。

感谢Dmitry建议使用DASL。