NRules:匹配一个集合
NRules: match a collection
我正在尝试找出 BRE 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();
我做错了什么?
在你的例子中,它应该非常简单
IEnumerable<Order> orders = null;
When()
.Collect<Order>(() => orders, o => o.Cancelled == true);
Then()
.Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
我认为重要的部分是单独的 o.Cancelled 而没有 == true。我知道这听起来很奇怪,但是 NRules 没有很好地支持 属性 本身不是表达式的评估(即只是 属性)。
我 运行 解决了这个问题,当我添加 == true 时,一切就绪。
使用 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));
如何根据
等表达式加入多个集合
IEnumerable<RawMsp> rawMsps = null;
IEnumerable<AsmMasterView> asmMasterViews = null;
IEnumerable<AsmInvestor> asmInvestors = null;
When()
.Match<AsmInvestor>(() => rawMsps)
.Match<AsmInvestor>(() => asmInvestor, i => i.InvestorId.ToString() == rawMsp.INVESTOR_CODE)
.Match<AsmMasterView>(() => asmMasterView, x => x.ChildAssumptionHistId == asmInvestor.AssumptionHistId);
匹配适用于单个对象,不确定是否适用于可枚举对象
我正在尝试找出 BRE 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();
我做错了什么?
在你的例子中,它应该非常简单
IEnumerable<Order> orders = null;
When()
.Collect<Order>(() => orders, o => o.Cancelled == true);
Then()
.Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
我认为重要的部分是单独的 o.Cancelled 而没有 == true。我知道这听起来很奇怪,但是 NRules 没有很好地支持 属性 本身不是表达式的评估(即只是 属性)。
我 运行 解决了这个问题,当我添加 == true 时,一切就绪。
使用 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));
如何根据
等表达式加入多个集合 IEnumerable<RawMsp> rawMsps = null;
IEnumerable<AsmMasterView> asmMasterViews = null;
IEnumerable<AsmInvestor> asmInvestors = null;
When()
.Match<AsmInvestor>(() => rawMsps)
.Match<AsmInvestor>(() => asmInvestor, i => i.InvestorId.ToString() == rawMsp.INVESTOR_CODE)
.Match<AsmMasterView>(() => asmMasterView, x => x.ChildAssumptionHistId == asmInvestor.AssumptionHistId);
匹配适用于单个对象,不确定是否适用于可枚举对象