Aracılığıyla paylaş


Nasıl yapılır: Çalışma Zamanında Karşılaştırma Filtrelerini Dinamik Olarak Belirtme (C# Programlama Kılavuzu)

Bazı durumlarda, çalışma zamanına kadar kaç kaynak öğelere uygulanacak olan yüklemleri bilmediğiniz where yan tümcesi.Birden çok koşul filtreler dinamik olarak belirlemek için bir yoludur kullanmak için Contains``1 yöntemi, aşağıdaki örnekte gösterildiği gibi.Bu örnek iki şekilde oluşturulur.İlk olarak, proje programda sağlanan değerleri filtre tarafından çalıştırılır.Sonra da projeyi zamanında sağlanan giriş kullanarak yeniden çalıştırın.

CONTAINS yöntemini kullanarak filtre uygulamak için

  1. Yeni bir konsol uygulaması Visual Studio'da açın.Name it PredicateFilters.

  2. Copy StudentClass gelen sınıf Nasıl yapılır: Nesneler Koleksiyonunu Sorgulama (C# Programlama Kılavuzu) ve ad alanına yapıştırın PredicateFilters sınıfı altında Program.StudentClassbir listesini sağlar Student nesneler.

  3. Yorum Main yönteminde StudentClass.

  4. Sınıf başkasıyla Program yerine aşağıdaki 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. Aşağıdaki satırı Main yöntemi sınıfta DynamicPredicates, bildirimi altında ids.

    QueryById(ids);
    
  6. F5 tuşuna basarak projeyi çalıştırın.

  7. Bir komut istemi penceresinde aşağıdaki çıkış görüntülenir:

    Garcia: 114

    O'Donnell: 112

    Omelchenko: 111

  8. Projeyi yeniden çalıştırmak için sonraki adım ise, dizi yerine çalışma zamanında giriş kullanarak bu kez girilen ids.İçinde Solution Explorer, sağ PredicateFiltersözelliklerini.

  9. Tıklatın Debug sekmesi.

  10. İçinde komut satırı bağımsız değişkenleri pencere, türü 122, 117, 120 ve 115, boşluklarla ayrılmış: 122 117 120 115.Proje çalıştırıldığında, bu değerler öğeleri haline args, parametre, Main yöntemi.

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

  12. F5 tuşuna basarak projeyi çalıştırın.

  13. Bir komut istemi penceresinde aşağıdaki çıkış görüntülenir:

    Adams: 120

    Feng: 117

    Garcia: 115

    Tucker: 122

Bir switch ifadesi kullanarak filtre uygulamak için

  1. Kullanabileceğiniz bir switch deyimi arasından seçim yapmak için önceden alternatif sorgular.Aşağıdaki örnekte, studentQuery farklı bir kullanır where bağlı olarak hangi derece düzeyinde veya yıl, belirtilen çalışma zamanında yan tümcesi.

  2. Aşağıdaki yöntem kopyalayın ve sınıfta 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. İçinde komut satırı bağımsız değişkenleri penceresinde, önceki yordamı 1 ile 4 arasında bir tamsayı değeri ile değiştir kimliği numaraları.

  4. De Main yöntemi çağrısı yerine QueryByID şu çağrı ile ilk öğeden gönderir, args dizi argüman olarak: QueryByYear(args[0]).

  5. F5 tuşuna basarak projeyi çalıştırın.

Bu yöntemi kendi uygulamalarında kullanmak için

  • Bu yöntem uygulama için uyum LINQ sürümü 3.5 veya 4 gerektirdiğini unutmayın .NET Framework, proje System.Core.dll başvuru içermelidir ve bir using yönergesi için System.Linq.LINQ sql, XML LINQ ve LINQ DataSet türleri için gerekli ek using yönergeleri ve başvuru.Daha fazla bilgi için bkz. Nasıl yapılır: Bir LINQ Projesi Oluşturma.

Ayrıca bkz.

Başvuru

where tümcesi (C# Başvurusu)

Kavramlar

LINQ Sorgu İfadeleri (C# Programlama Kılavuzu)