2

我正在尝试找出 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();

我在这里做错了什么?

4

3 回答 3

5

使用 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));
于 2015-02-13T02:00:30.180 回答
2

在您的示例中,它应该非常简单

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时,一切都到位了。

于 2015-01-29T18:48:43.467 回答
-1

如何根据某些表达式加入多个集合,例如

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

匹配适用于单个对象,不确定是否适用于可枚举对象

于 2018-04-13T19:46:44.970 回答