C# 如何在WWF中迭代数据表?

C# 如何在WWF中迭代数据表?,c#,datatable,workflow-foundation,C#,Datatable,Workflow Foundation,探索WWF我在处理数据表时遇到了困难。假设我有一个表,我想根据该表中每一行的数据进行一些计算。为此,我将添加一个CodeActivity作为工作流中的第一步,该步骤将读取该表并填充一个DataTable,该DataTable将存储为工作流的私有字段。我想之后我会使用ReplicatorActivity,正如MSDN所建议的那样,作为foreach循环的替代品,用于迭代数据,它将有另一个CodeActivity,它将根据行的数据进行所有计算。问题是ReplicatorActivity只能通过Sys

探索WWF我在处理数据表时遇到了困难。假设我有一个表,我想根据该表中每一行的数据进行一些计算。为此,我将添加一个CodeActivity作为工作流中的第一步,该步骤将读取该表并填充一个DataTable,该DataTable将存储为工作流的私有字段。我想之后我会使用ReplicatorActivity,正如MSDN所建议的那样,作为foreach循环的替代品,用于迭代数据,它将有另一个CodeActivity,它将根据行的数据进行所有计算。问题是ReplicatorActivity只能通过System.Collections.IList进行迭代,但我们知道System.Data.DataTable.Rows属于DataRowCollection类型,它通过InternalDataCollectionBase实现ICollection和IEnumerable,而不是IList

你有什么建议?在这种情况下,我应该使用WhileActivity而不是ReplicatorActivity,还是其他方法? 我应该在一个长时间运行的CodeActivity中完成所有计算吗?
根据您所描述的单个代码,活动可以简单地处理业务。查看以下代码并构造如下内容:

public sealed class TableManipulationActivity : CodeActivity<DataTable>
{
    [Required]
    public InArgument<DataTable> TableInArgument { get; set; }

    private DataTable _table;

    protected override DataTable Execute(CodeActivityContext context)
    {
        _table = TableInArgument.Get(context);

        // play with _table value and do whatever you want [All sorts of CRUD operations]

        var result = new DataTable(); // populate this result 

        // Manipulate result 
        // ...
        // ...

        return result;
    }
}

根据您的问题描述,上述方法非常简单且可重复使用。

首先不使用DataTable怎么样?他们早在框架的早期就有了自己的位置,但使用起来非常糟糕。@DanielKelley,那么我们将非常感谢您提出的任何建议。@Jyrkka:如果提供的答案对您有帮助,请将答案标记为正确答案,否则请提供更多详细信息。在开始学习构建新框架之前活动,我试图了解如何使用WF的内置功能,此外,同样的任务也可以通过简单的CodeActivity或再次利用IEnumerator的WhileActivity来完成,存储为工作流的私有字段以在表中运行,我只是试图理解如何使用ReplicatorActivity来实现这一点。ReplicatorActivity类在.NET 4.5中已经过时,您不应该再使用它。变量和参数在WF 4.5的运行时进行管理,内置活动可以访问它们,但工作流3.5的情况并非如此,在工作流3.5中,您必须创建自定义活动来复制实例数据。如果你想坚持使用.NET 4.5或更高版本,我的建议是不要使用ReplicatorActivity。目前我的目标是3.5