是否可以在Windows工作流规则条件中使用LINQ查询?

时间:2012-07-26 17:37:48

标签: c# workflow-foundation rule-engine

我正在对规则引擎的实现进行原型设计,以帮助我们订购门户网站。例如,如果订购某些商品,则对商品给予折扣或要求批准。我们还希望能够为美元金额,用户层次结构位置添加规则,并将其应用于一个或多个客户端。

我觉得世界自然基金会很好地满足了这种需求。

所有这些都说明了我在确定如何最好地设置一些更复杂的规则时遇到一些困难。我有一个“条件”,我觉得最好在LINQ查询中描述,如:

var y = from ol in currentOrder.OrderLines where ol.ItemCode == "MYITEMCODE" select ol;

我不反对为规则引擎使用不同的框架或向对象添加其他属性/方法(例如:OrderHasItem(ItemCode)等)以使这些规则更加简化但我想避免不得不这样做那。这让人感到沮丧,因为它迫使我们走上了可能需要对新规则进行代码更改的道路。

2 个答案:

答案 0 :(得分:3)

是的,您可以将Linq查询与Workflow一起使用。在WF中,您所指的是一个在运行时计算的表达式。您的查询是根据条件选择有序性的子集。

例如,如果我有一个名称集合,我想只看到以“R”开头的名称。我可以写下面的代码。

private static void ShowQueryWithCode(IEnumerable<string> names)
{
    Console.WriteLine("LINQ Query in Code - show names that start with 'R'");

    // Assuming there are no null entries in the names collection
    var query = from name in names where name.StartsWith("R") select name;

    // This is the same thing as 
    // var query = names.Where(name => name.StartsWith("R"));
    foreach (var name in query)
    {
        Console.WriteLine(name);
    }

    Console.WriteLine();
}

对Workflow

执行相同操作

步骤1:使用类型为IEnumerable的In Argument创建工作流程

在这里你可以看到我添加了in参数 in argument

步骤2:为IEnumerable类型的查询添加变量

在添加变量之前,您需要包含一个包含变量的活动。在这个工作流程中,我添加了一个序列。

variable

步骤3:为查询分配您要使用的LINQ表达式 您可以使用方法链或查询语法。

expression

第4步:对集合进行迭代

在完成的工作流程中,我使用ForEach活动迭代名称列表并将其写入控制台。

Workflow1

此示例在.NET 4.5中使用C#,但Visual Basic可以使用相同的技术。

您可以下载示例代码here

答案 1 :(得分:0)

WF是一个工作流引擎。它曾用于经营工厂和银行。规则引擎只是其中的一小部分。有意义的是,任何正常的WF项目都需要专业的专业团队来构建它。对于您的特定目的而言似乎有点矫枉过正。您很可能将自己和项目埋没在团队的要求和真实技能之间的典型战斗中。

在您的情况下,使用任何可用的.NET引擎都更合理。请记住,无论从一开始看起来多么简单,构建自定义规则引擎并不是一件容易的事。设置类的属性值(通常称为“事实”或“源”对象)或执行操作(调用类'方法)是规则引擎最好的。它似乎正是你所需要的。查看一些可用的.NET引擎。它们价格低廉,即使不是免费的,也是可靠的。