Обычно вы пишете запрос и получаете все записи (сущности), которые соответствуют ему. Мне нужно сделать обратный.
Скажем, у меня 1M клиентов с несколькими дюжинами денормализованных свойств:
public class Customer {
public string Name {get;set;}
public string Email {get;set;}
public string Phone {get;set;}
public DateTime Birthday {get;set;}
public DateTime LastEmailed {get;set;}
public DateTime LastCalled {get;set;}
public int AgeInYears {get { return DateTime.UtcNow.Year - birthdate.Year;}}
public int SalesTerritoryId {get;set;}
// etc.
}
И у меня есть 10k пользователей, которые хотят настроить пользовательские фильтры и получать уведомления, когда любой новый клиент соответствует установленным им правилам.
Некоторые из этих правил оцениваются при создании/обновлении клиента (например.)
- Клиенты с номером телефона И на моей торговой территории.
- Клиенты с электронной почтой и LastEmailed являются NULL, а торговая территория IN (1, 7, 11)
Другие правила будут периодически выполняться (например.)
- Клиенты с днем рождения сегодня.
Ежедневно для клиентов будут сохраняться миллионы сохраненных и настраиваемых фильтров 5-10 тыс. для каждого нового/обновленного клиента.
Я понимаю, что я могу использовать Деревья выражений для пользовательских фильтров, но затем в итоге сделаю что-то вроде этого:
public class CustomerRule : IRule {
public bool IsMatch() {
// Expression Tree Stuff
}
public bool DoAction() {
// Notification Stuff
}
}
public class CustomerService {
public void SaveOrUpdate {
IList<IRule> rules = GetRules();
// this isn't going to handle 1M save/updates * 10k rules very well
foreach (var rule in rules){
if(rule.IsMatch()) {
rule.DoAction();
}
}
}
}
Я знаю, что другие решили эту проблему, но мне сложно определить, что именно искать. Общее руководство ценится, конкретные шаблоны, код, инструменты и т.д. Еще лучше. В первую очередь мы используем С#, но при необходимости можем выйти за пределы .NET.