LINQ to Objects 活动

本主题适用于 Windows Workflow Foundation 4。

此示例演示如何创建活动以使用 LINQ to Objects 查询集合中的元素。

FindInCollection 的活动详细信息

此活动允许用户使用 LINQ to Objects 查询内存中集合的元素。您必须提供 lambda 表达式形式的 LINQ 谓词以筛选结果。可将此活动与 AddToCollection 活动一起使用。

下表详述了活动的属性和返回值。

属性或返回值 说明

Collection 属性

一个指定源集合的必需属性。

Predicate 属性

一个必需属性,它指定 lambda 表达式形式的集合的筛选器。

返回值

筛选的集合。

使用自定义活动的代码示例

下面的代码示例使用 FindInCollection 自定义活动查找员工集合中的所有行,这些员工的 Role 属性设置为 ManagerLocation 属性设置为 Redmond

// Find all program managers in Redmond in the employees collection.

Activity wf = new FindInCollection<Employee>
{
    Collections = new LambdaValue<IEnumerable<Employee>>(c => employees),              
    Predicate = new LambdaValue<Func<Employee, bool>>(c => new Func<Employee, bool>(e => e.Role.Equals("Manager") && e.Location.Equals("Redmond")))
};

下面的代码演示如何创建一个工作流程序,此程序使用自定义 FindInCollection 活动、AddToCollectionForEach 活动,在集合中填入员工,查找 Redmond 市角色为开发人员的所有员工,然后循环访问结果列表。

// Create the Linq predicate for the find expression

Func<Employee, bool> predicate = e => e.Role == "DEV" && e.Location.Equals("Redmond");

// Create workflow program
Activity sampleWorkflow = new Sequence
{
    Variables = { employees, devsFromRedmond },
    Activities =
    {
        new Assign<IList<Employee>>
        {
            To = employees,
            Value = new LambdaValue<IList<Employee>>(c => new List<Employee>())
        },
        new AddToCollection<Employee>
        {
            Collection = new InArgument<ICollection<Employee>>(employees),
            Item =  new LambdaValue<Employee>(c => new Employee(1, "Employee 1", "DEV", "Redmond"))
        },
        new AddToCollection<Employee>
        {
            Collection = new InArgument<ICollection<Employee>>(employees),
            Item =  new LambdaValue<Employee>(c => new Employee(2, "Employee 2", "DEV", "Redmond"))
        },
        new AddToCollection<Employee>
        {
            Collection = new InArgument<ICollection<Employee>>(employees),
            Item =  new LambdaValue<Employee>(c => new Employee(3, "Employee 3", "PM", "Redmond"))
        },
        new AddToCollection<Employee>
        {
            Collection = new InArgument<ICollection<Employee>>(employees),
            Item =  new LambdaValue<Employee>(c => new Employee(4, "Employee 4", "PM", "China"))
        },
        new FindInCollection<Employee>
        {
            Collections = new InArgument<IEnumerable<Employee>>(employees),
            Predicate = new LambdaValue<Func<Employee, bool>>(c => predicate),
            Result = new OutArgument<IList<Employee>>(devsFromRedmond)
        },
        new ForEach<Employee>
        {
            Values = new InArgument<IEnumerable<Employee>>(devsFromRedmond),
            Body = new ActivityAction<Employee>
            {
                Argument = iterationVariable,
                Handler = new WriteLine
                {
                    Text = new InArgument<string>(env => iterationVariable.Get(env).ToString())
                }
            }
        }
    }
};

使用此示例

  1. 使用 Visual Studio 2010 打开 LinqToObjects.sln 解决方案文件。

  2. 若要生成解决方案,请按 F6。

  3. 若要运行解决方案,请按 F5。

Dd797580.Important(zh-cn,VS.100).gif 注意:
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:

<安装驱动器>:\WF_WCF_Samples

如果此目录不存在,请访问针对 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:

<安装驱动器>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\Linq\LinqToObjects

另请参见

其他资源

Lambda 表达式(C# 编程指南)(可能为英文网页)
LINQ to Objects(可能为英文网页)