在 EWS 上使用 AND 运算符时搜索过滤器不起作用?
Search filters not working when using AND operator on EWS?
我正在尝试使用两个过滤器过滤电子邮件:今天发送的电子邮件和来自特定收件人的电子邮件。
我尝试了以下方法:
DateTime searchdate = DateTime.Today;
SearchFilter greaterthanfilter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, searchdate);
SearchFilter lessthanfilter = new SearchFilter.IsLessThan(ItemSchema.DateTimeReceived, searchdate.AddHours(24));
SearchFilter senderFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.From, "some-email-here@domain.com");
SearchFilter dateFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, greaterthanfilter, lessthanfilter);
SearchFilter allFilters = new SearchFilter.SearchFilterCollection(LogicalOperator.And, dateFilter, senderFilter);
Folder folder = Folder.Bind(service, WellKnownFolderName.Inbox);
FindItemsResults<Item> results = folder.FindItems(allFilters, new ItemView(50));
foreach(Item i in results)
{
Console.WriteLine(i.Subject);
}
如果我单独使用过滤器,一切正常。我要么收到按发件人过滤的电子邮件,要么收到按接收日期过滤的电子邮件。如果我将 LogicalOperator
更改为 OR
,一切都会很好。
出于某种原因,当我添加 LogicalOperator.And
时,没有返回电子邮件。
如果你有更好的方法,请告诉我!
你的搜索过滤器在我测试时工作正常,作为替代方案,你可以使用 QueryString,如果没有别的,它应该更快 https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/querystring-querystringtypeand AQS/KQL 例如
(Received:today) AND (From:'user@domain.com')
如果你只在消息后说 sent/received 今天 lessthanfilter 是多余的(因为日期是未来的)
,你可以稍微简化你的 SearchFilters
按照@glen-scales 的建议,我查看了查询字符串,起初并没有帮助我,因为它们也没有解决问题!
原来这是你如何编写查询字符串的问题!这对我来说非常有效:
FindItemsResults<Item> findResults = service.FindItems(folder.Id, "from:email@domain.com AND Received:Today", new ItemView(20));
而这根本不起作用:
FindItemsResults<Item> findResults = service.FindItems(folder.Id, "(from:email@domain.com) AND (Received:Today)", new ItemView(20));
如果您没有注意到,区别在于括号的使用(尽管我相信它们应该没有问题)。
有关查询字符串的更多文档,请参阅以下 link:https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/ee693615%28v%3dexchg.140%29
我正在尝试使用两个过滤器过滤电子邮件:今天发送的电子邮件和来自特定收件人的电子邮件。 我尝试了以下方法:
DateTime searchdate = DateTime.Today;
SearchFilter greaterthanfilter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, searchdate);
SearchFilter lessthanfilter = new SearchFilter.IsLessThan(ItemSchema.DateTimeReceived, searchdate.AddHours(24));
SearchFilter senderFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.From, "some-email-here@domain.com");
SearchFilter dateFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, greaterthanfilter, lessthanfilter);
SearchFilter allFilters = new SearchFilter.SearchFilterCollection(LogicalOperator.And, dateFilter, senderFilter);
Folder folder = Folder.Bind(service, WellKnownFolderName.Inbox);
FindItemsResults<Item> results = folder.FindItems(allFilters, new ItemView(50));
foreach(Item i in results)
{
Console.WriteLine(i.Subject);
}
如果我单独使用过滤器,一切正常。我要么收到按发件人过滤的电子邮件,要么收到按接收日期过滤的电子邮件。如果我将 LogicalOperator
更改为 OR
,一切都会很好。
出于某种原因,当我添加 LogicalOperator.And
时,没有返回电子邮件。
如果你有更好的方法,请告诉我!
你的搜索过滤器在我测试时工作正常,作为替代方案,你可以使用 QueryString,如果没有别的,它应该更快 https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/querystring-querystringtypeand AQS/KQL 例如
(Received:today) AND (From:'user@domain.com')
如果你只在消息后说 sent/received 今天 lessthanfilter 是多余的(因为日期是未来的)
,你可以稍微简化你的 SearchFilters按照@glen-scales 的建议,我查看了查询字符串,起初并没有帮助我,因为它们也没有解决问题! 原来这是你如何编写查询字符串的问题!这对我来说非常有效:
FindItemsResults<Item> findResults = service.FindItems(folder.Id, "from:email@domain.com AND Received:Today", new ItemView(20));
而这根本不起作用:
FindItemsResults<Item> findResults = service.FindItems(folder.Id, "(from:email@domain.com) AND (Received:Today)", new ItemView(20));
如果您没有注意到,区别在于括号的使用(尽管我相信它们应该没有问题)。
有关查询字符串的更多文档,请参阅以下 link:https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/ee693615%28v%3dexchg.140%29