Поделиться через


Действие LINQ to Objects

Данный раздел относится к версии Windows Workflow Foundation 4.

В этом образце демонстрируется создание действия, использующего LINQ to Objects для запроса к элементам в коллекции.

Сведения о действии FindInCollection

Это действие позволяет пользователям создавать запросы к элементам в коллекциях в памяти с помощью LINQ to Objects. Необходимо указать предикат LINQ в форме лямбда-выражения для фильтрации результатов. Это действие может быть использовано вместе с действиями AddToCollection.

В следующих сведениях о таблице подробно описаны свойства и возвращаемые значения для действия.

Свойство или возвращаемое значение Описание

CollectionСвойство

Обязательное свойство, в котором указывается исходная коллекция.

PredicateСвойство

Обязательное свойство, в котором указывается фильтр для коллекции в виде лямбда-выражения.

Возвращаемое значение

Фильтруемая коллекция.

Образец кода, использующий настраиваемое действие

В следующем примере кода настраиваемое действие FindInCollection используется для нахождения всех строк в коллекции служащих, у которых свойство Role равно Manager, а свойство Location равно 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 и действия AddToCollection и ForEach для заполнения коллекции служащими, нахождения всех служащих, играющих роль разработчика и работающих в Редмонде и для итерации по получаемому списку результатов.

// 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. Откройте файл решения LinqToObjects.sln в среде Visual Studio 2010.

  2. Чтобы построить решение, нажмите клавишу F6.

  3. Чтобы запустить решение, нажмите клавишу F5.

Dd797580.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\Linq\LinqToObjects

См. также

Другие ресурсы

Лямбда-выражения (Руководство по программированию на C#)
LINQ to Objects