2015-01-28 8 views
2

Я пытаюсь выяснить BRE NRules и получить некоторые примеры работы, но с трудом подбираю коллекцию.NRules: соответствие коллекции

IEnumerable<Order> orders = null; 

When() 
    .Match<IEnumerable<Order>>(o => o.Where(c => c.Cancelled).Count() >= 3) 
    .Collect<Order>(() => orders, o => o.Cancelled); 

Then() 
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething())); 

В принципе, я хочу, если есть 3 заказа отменены, то выполните некоторые действия. Но я не могу найти совпадение в коллекции, отдельные переменные действительно работают.

Программа:

var order3 = new Order(123458, customer, 2, 20.0); 
var order4 = new Order(123459, customer, 1, 10.0); 
var order5 = new Order(123460, customer, 1, 11.0); 

order3.Cancelled = true; 
order4.Cancelled = true; 
order5.Cancelled = true; 

session.Insert(order3); 
session.Insert(order4); 
session.Insert(order5); 

session.Fire(); 

Что я здесь делаю неправильно?

ответ

2

С версии 0.3.1 NRules следующее активирует правило, когда вы собрали 3 или более аннулированных заказов:

IEnumerable<Order> orders = null; 

When() 
    .Collect<Order>(() => orders, o => o.Cancelled) 
     .Where(x => x.Count() >= 3); 
Then() 
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething())); 

Обновление:

для потомков, начиная с версии 0.4.x правильный синтаксис - использовать реактивный LINQ. Соответствие коллекции будет выглядеть так:

IEnumerable<Order> orders = null; 
When() 
    .Query(() => orders, q => q 
     .Match<Order>(o => o.Cancelled) 
     .Collect() 
     .Where(x => x.Count() >= 3)); 
Then() 
    .Do(ctx => DoSomething(orders)); 
2

В вашем примере, это должно быть довольно просто

IEnumerable<Order> orders = null; 

When() 
    .Collect<Order>(() => orders, o => o.Cancelled == true); 

Then() 
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething())); 

Я считаю, что важной частью является o.Cancelled в одиночку без == истинного. Я знаю, что это звучит глупо, но как-то только оценка свойств, которая не является выражением (т. Е. Просто свойство), плохо поддерживается в NRules.

Я столкнулся с этой проблемой, и когда я добавил == true все встало на свои места.

+0

Спасибо, я дам ему попробовать завтра и дам вам знать. :) –