Udostępnij za pośrednictwem


Jak: dynamicznie określ filtry predykat w czasie wykonywania (Podręcznik programowania C#)

W niektórych przypadkach nie znasz do czasu wykonywania predykaty ile mają zastosowanie do elementów źródłowych w where klauzuli.Jednym ze sposobów dynamicznie określić wiele filtrów predykatu jest użycie Contains metody, jak pokazano w poniższym przykładzie.Przykładem jest skonstruowany na dwa sposoby.Po pierwsze projekt jest uruchamiany przez filtrowanie wartości, które są dostarczane w programie.Następnie projekt jest uruchamiany ponownie przy użyciu danych wejściowych w czasie wykonywania.

Aby filtrować przy użyciu metody zawiera

  1. Otwórz nową aplikację konsoli w programie Visual Studio.Name it PredicateFilters.

  2. Kopia StudentClass klasy z Jak: kwerendy kolekcji obiektów (Podręcznik programowania C#) i wkleić go do obszaru nazw PredicateFilters pod spodem klasy Program.StudentClasszawiera listę Student obiektów.

  3. Komentarz Main metodę w StudentClass.

  4. Zastąpić klasy Program z następującego kodu.

    class DynamicPredicates : StudentClass
    {
        static void Main(string[] args)
        {
            string[] ids = { "111", "114", "112" };
    
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    
        static void QueryByID(string[] ids)
        {
            var queryNames =
                from student in students
                let i = student.ID.ToString()
                where ids.Contains(i)
                select new { student.LastName, student.ID };
    
            foreach (var name in queryNames)
            {
                Console.WriteLine("{0}: {1}", name.LastName, name.ID);
            }
        }
    }
    
  5. Dodaj następujący wiersz, aby Main metoda w klasie DynamicPredicates, w deklaracji z ids.

    QueryById(ids);
    
  6. Naciśnij klawisz F5, aby uruchomić projekt.

  7. Następujące dane wyjściowe są wyświetlane w oknie wiersza polecenia:

    Garcia: 114

    O'Donnell: 112

    Omelczenko: 111

  8. Następnym krokiem jest ponownie uruchomić projekt, tym razem przy użyciu wejściowe wprowadzone w czasie wykonywania, zamiast tablicy ids.W Solution Explorer, kliknij prawym przyciskiem myszy PredicateFilters , a następnie kliknij przycisk Właściwości.

  9. Kliknij przycisk debugowania kartę.

  10. W argumenty wiersza polecenia okna, należy wpisać 122, 117, 120 i 115, oddzielonych spacjami: 122 117 120 115.Po uruchomieniu projektu, wartości te stają się elementy args, parametr Main metody.

  11. Change QueryByID(ids) to QueryByID(args) in the Main method.

  12. Naciśnij klawisz F5, aby uruchomić projekt.

  13. Następujące dane wyjściowe są wyświetlane w oknie wiersza polecenia:

    Adams: 120

    Feng: 117

    Garcia: 115

    Tucker: 122

Aby filtrować przy użyciu instrukcji switch

  1. Można użyć switch instrukcji, aby wybrać kod spośród wstępnie ustalone alternatywnych kwerend.W poniższym przykładzie studentQuery korzysta z inną where klauzuli, w zależności od kategorii, których poziom lub roku, jest określony w czasie wykonywania.

  2. Skopiuj następujące metody i wkleić go do klasy DynamicPredicates.

    // To run this sample, first specify an integer value of 1 to 4 for the command
    // line. This number will be converted to a GradeLevel value that specifies which
    // set of students to query. 
    // Call the method: QueryByYear(args[0]);
    
    static void QueryByYear(string level)
    {
        GradeLevel year = (GradeLevel)Convert.ToInt32(level);
        IEnumerable<Student> studentQuery = null;
        switch (year)
        {
            case GradeLevel.FirstYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.FirstYear
                               select student;
                break;
            case GradeLevel.SecondYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.SecondYear
                               select student;
                break;
            case GradeLevel.ThirdYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.ThirdYear
                               select student;
                break;
            case GradeLevel.FourthYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.FourthYear
                               select student;
                break;
    
            default:
                break;
        }
        Console.WriteLine("The following students are at level {0}", year.ToString());
        foreach (Student name in studentQuery)
        {
            Console.WriteLine("{0}: {1}", name.LastName, name.ID);
        }
    }
    
  3. W argumenty wiersza polecenia okna, Zastąp identyfikator numery z poprzedniej procedury z całkowitą z zakresu od 1 do 4.

  4. W Main metodę, zastąpić wywołanie QueryByID z następujące wywołanie, które wysyła pierwszy element z args tablicy jako argumentu: QueryByYear(args[0]).

  5. Naciśnij klawisz F5, aby uruchomić projekt.

Aby użyć tej metody we własnych aplikacjach

  • Jeśli ta metoda dostosowania się do własnej aplikacji, należy pamiętać, że LINQ wymaga wersji 3.5 lub 4 .NET Framework, i że projekt musi zawierać odniesienie do System.Core.dll i using w dyrektywie dla System.Linq.LINQ SQL, LINQ XML i LINQ DataSet typów wymagają dodatkowych using dyrektyw i odwołania.Aby uzyskać więcej informacji, zobacz Jak: Tworzenie projektu LINQ.

Zobacz też

Informacje

gdy klauzula (C# odniesienia)

Koncepcje

Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)