Aracılığıyla paylaş


İzlenecek yol: Sorgular C# (LINQ) yazma

Bu izlenecek yolda yazmak için kullanılan C# dili özelliklerini gösterir LINQ sorgu ifadelerini.Bu izlenecek yolu tamamladıktan sonra örnekler ve belirli belgeler için geçmek hazır olacak LINQ sağlayıcı, gibi ilgileniyorsanız LINQ to SQL, LINQ , DataSet için veya LINQ to XML.

Önkoşullar

Bu izlenecek yolda, Visual Studio 2008'de sunulan özellikleri gerektirir.

video bağlantısı Bu konunun videosu için bkz: Video nasıl: C# [NULL]'ta (LINQ) sorguları yazma.

Bir C# projesi oluşturma

Bir proje oluşturmak için

  1. Visual &Studio'yu başlatın.

  2. Menü çubuğunda Dosya, Yeni, Proje'yi seçin.

    Yeni Proje iletişim kutusu açılır.

  3. Genişletme yüklü, genişletin şablonları, genişletin **Visual C#**ve sonra seçin Konsol uygulaması.

  4. İçinde adı metin kutusuna farklı bir ad girin veya varsayılan adı kabul edin ve sonra seçin Tamam düğmesi.

    Çözüm Gezgini'nde yeni proje görüntülenir.

  5. Projeniz System.Core.dll başvuru vardır ve bir using yönergesi için System.Linq ad alanı.

Bir bellek içi veri kaynağı oluşturma

Basit bir listesini sorgular için veri kaynağı olan Student nesneler.Her Student ilk adı, Soyadı ve test puanlarını sınıfında temsil eden dizisi kaydı yok.Projenize bu kodu kopyalayın.Aşağıdaki özelliklere dikkat edin:

  • Student Sınıfı otomatik gerçeklenen özellikler içerir.

  • Listedeki her Öğrenci ile bir nesne Başlatıcısı başlatıldı.

  • Liste bir koleksiyon başlatıcıyı ile başlatıldı.

Bu tüm veri yapısı başlatılamadı ve açık çağrılar herhangi bir yapıcı veya açık üye erişimi olmadan örneği.Bu yeni özellikler hakkında daha fazla bilgi için bkz: Otomatik uygulanan özellikler (C# Programlama Kılavuzu) ve Nesne ve koleksiyon Başlatıcı (C# Programlama Kılavuzu).

Veri kaynağı oluşturmak için

  • Ekleme Student sınıf ve öğrenciler için başlatılan listesini Program sınıfı projenizdeki.

    public class Student
    {
        public string First { get; set; }
        public string Last { get; set; }
        public int ID { get; set; }
        public List<int> Scores;
    }
    
    // Create a data source by using a collection initializer.
    static List<Student> students = new List<Student>
    {
       new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
       new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
       new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94, 65, 91}},
       new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
       new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91, 70}},
       new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90, 94}},
       new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80, 87}},
       new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
       new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88, 92}},
       new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
       new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85, 91, 60}},
       new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91, 91} }
    };
    

Yeni bir öğrenci öğrenciler listesine eklemek için

  • Yeni bir ekleme Student için Students listesi ve bir ad kullanın ve test puanlarının seçeceğiniz.Nesne Başlatıcısı sözdizimi daha iyi öğrenmek için yeni öğrenci bilgilerini yazmayı deneyin.

Sorgu oluşturma

Basit bir sorgu oluşturmak için

  • Uygulamanın içinde Main yöntemi, yürütüldüğünde, üreten, tüm öğrenciler, ilk test puanı 90'dan büyük bir liste basit bir sorgu oluşturun.Çünkü unutmayın bütün Student nesne seçiliyse, sorgu türü IEnumerable<Student>.Örtülü yazma kullanarak kodu da kullanabilirsiniz, ancak var anahtar sözcüğünü yazarak açık sonuçları açıkça göstermek için kullanılır.(Hakkında daha fazla bilgi için var, bkz: Yerel değişkenler örtülü olarak yazılı (c Programlama Kılavuzu #).)

    Ayrıca sorgunun unutmayın aralık değişkeni student, her bir başvuru olarak hizmet veren Student kaynağındaki her nesne için üye erişimi sağlama.


// Create the query.
// The first line could also be written as "var studentQuery ="
IEnumerable<Student> studentQuery =
    from student in students
    where student.Scores[0] > 90
    select student;

Sorguyu çalıştırmak

Sorguyu yürütmek için

  1. Şimdi yaz foreach döngü sorguyu yürütmek neden olur.Kod hakkında aşağıdakilere dikkat edin:

    • Her öğe, döndürülen dizi yineleme değişkeni aracılığıyla erişilen foreach döngü.

    • Bu değişken türü Student, ve sorgu değişkeni türü uyumlu IEnumerable<Student>.

  2. Bu kodu ekledikten sonra yapı ve sonuçları görmek için Ctrl + F5 tuşuna basarak uygulamayı çalıştırmak Konsol pencere.

// Execute the query.
// var could be used here also.
foreach (Student student in studentQuery)
{
    Console.WriteLine("{0}, {1}", student.Last, student.First);
}

Başka bir filtre koşulu eklemek için

  • Birden çok koşulu Boole birleştirebilirsiniz where bir sorgu daha fazla daraltmak için yan tümcesi.Aşağıdaki kod, böylece sorgu bu öğrenciler, ilk puan verir bir koşul üzerinde 90 ve son puanı olan 80'den az şeklindeydi ekler.where Yan tümcesi aşağıdaki kod benzer.

    where student.Scores[0] > 90 && student.Scores[3] < 80
    

    Daha fazla bilgi için bkz. WHERE yan tümcesi (C# Reference).

Sorguyu değiştirin

Sonuçlarını sıralamak için

  1. Sipariş mesajlarından, tarama sonuçları daha kolay olacaktır.Döndürülen dizi kaynağı öğelerinin erişilebilir herhangi bir alana göre sıralayabilirsiniz.Örneğin, aşağıdaki orderby yan tümcesi siparişleri sonuçlarını alfabetik sırada A'dan z son saatine her öğrencinin ismi.Aşağıdaki orderby sorgunuz, sonra sağ yan where ifadesi ve önce select ifadesi:

    orderby student.Last ascending
    
  2. Şimdi değiştirmek orderby , BT sonuçları ters sırada puanı en yüksek puanı en düşük puanı için ilk testten üzerinde göre siparişler için yan tümcesi.

    orderby student.Scores[0] descending
    
  3. Değişiklik WriteLine kayýtlarý görebilirsiniz böylece dize biçimi:

    Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);
    

    Daha fazla bilgi için bkz. OrderBy yan tümcesi (C# Reference).

Grup sonuçları için

  1. Gruplandırma sorgu ifadeleri de güçlü bir yetenektir.Group by içeren bir sorgu gruplarını bir dizi oluşturur ve her grup içeren bir Key ve o grubun tüm üyelerini oluşan bir dizi.Aşağıdaki yeni sorgu öğrenciler kendi soyadının ilk harfini anahtar olarak kullanarak gruplandırır.

    // studentQuery2 is an IEnumerable<IGrouping<char, Student>>
    var studentQuery2 =
        from student in students
        group student by student.Last[0];
    
  2. Sorgu türü artık değiştiğini unutmayın.Şimdi bir dizi olan Grup oluşturduğu bir char türü bir anahtar ve bir dizi olarak Student nesneler.Sorgu türü değiştiği için aşağıdaki değişiklikleri kod foreach yürütme döngü de:

    // studentGroup is a IGrouping<char, Student>
    foreach (var studentGroup in studentQuery2)
    {
        Console.WriteLine(studentGroup.Key);
        foreach (Student student in studentGroup)
        {
            Console.WriteLine("   {0}, {1}",
                      student.Last, student.First);
        }
    }
    
  3. Uygulamayı çalıştırmak ve sonuçları görüntülemek için Ctrl + F5 tuşlarına basın Konsol pencere.

    Daha fazla bilgi için bkz. GROUP BY (C# Reference).

Dolaylı olarak yazılan değişkenleri oluşturmak için

  • Kodlama açıkça IEnumerables , IGroupings hızlı bir şekilde sıkıcı hale gelebilir.Aynı sorgu yazabilirsiniz ve foreach çok daha rahat kullanarak döngü var.var Anahtar sözcük; kendi nesne türlerini değiştirme Bunu yalnızca türleri gerçekleştirip derlememesini bildirir.Türünü değiştirmek studentQuery ve yineleme değişkeni group için var ve sorguyu yeniden çalıştırın.Unutmayın iç foreach , döngü değişkeni hala yazılı olarak Student, ve sorgu yalnızca gibi çalışır.Değişiklik s değişkeni için var ve sorguyu yeniden çalıştırın.Tam olarak aynı sonuçları almak konusuna bakın.

    var studentQuery3 =
        from student in students
        group student by student.Last[0];
    
    foreach (var groupOfStudents in studentQuery3)
    {
        Console.WriteLine(groupOfStudents.Key);
        foreach (var student in groupOfStudents)
        {
             Console.WriteLine("   {0}, {1}",
                 student.Last, student.First);
        }
    }
    

    Hakkında daha fazla bilgi için var, bkz: Yerel değişkenler örtülü olarak yazılı (c Programlama Kılavuzu #).

Grupları anahtar değerlerine göre sıralamak için

  • Önceki sorgu çalıştırdığınızda, Gruplar alfabetik sırada değildir dikkat edin.Bunu değiştirmek için sağlamanız gereken bir orderby yan tümcesinden sonra group yan tümcesi.Ancak kullanmak için bir orderby yan tümcesi öncelikle gerekir tarafından oluşturulan gruplara başvuru olarak hizmet veren bir tanımlayıcı group yan tümcesi.Tanımlayıcı kullanarak verdiğiniz into anahtar sözcüğünü aşağıdaki gibi:

                var studentQuery4 =
                    from student in students
                    group student by student.Last[0] into studentGroup
                    orderby studentGroup.Key
                    select studentGroup;
    
                foreach (var groupOfStudents in studentQuery4)
                {
                    Console.WriteLine(groupOfStudents.Key);
                    foreach (var student in groupOfStudents)
                    {
                        Console.WriteLine("   {0}, {1}",
                            student.Last, student.First);
                    }
                }
    
    

    Bu sorguyu çalıştırdığınızda, gruplar şimdi alfabetik olarak sıralanır göreceksiniz.

Tanımlayıcı let kullanarak tanıtmak için

  • Kullanabileceğiniz let herhangi bir sorgu ifadesinde deyimin sonucu için bir tanımlayıcı tanıtmak için anahtar sözcük.Kolaylık sağlamak amacıyla, aşağıdaki örnekte olduğu gibi bu tanımlayıcı olabilir veya birden çok kez hesaplanacak yok için bir ifadenin sonuçlarını saklama performansını artırabilirsiniz.

    // studentQuery5 is an IEnumerable<string>
    // This query returns those students whose
    // first test score was higher than their
    // average score.
    var studentQuery5 =
        from student in students
        let totalScore = student.Scores[0] + student.Scores[1] +
            student.Scores[2] + student.Scores[3]
        where totalScore / 4 < student.Scores[0]
        select student.Last + " " + student.First;
    
    foreach (string s in studentQuery5)
    {
        Console.WriteLine(s);
    }
    

    Daha fazla bilgi için bkz. yan tümcesi (C# Reference) olanak sağlar.

Bir sorgu ifadesinde yöntemi sözdizimini kullanmak için

  • Açıklandığı gibi LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#), bazı sorgu işlemleri yalnızca yöntemi sözdizimini kullanarak ifade edilebilir.Her biri için toplam puan aşağıdaki kodu hesaplar Student kaynak serisi ve ardından çağrıları Average() sınıfının ortalama puanı hesaplamak için bu sorgunun sonuçlarını yöntemi.Sorgu ifadesi parantezler yerleşimini unutmayın.

        var studentQuery6 = 
            from student in students
            let totalScore = student.Scores[0] + student.Scores[1] +
                student.Scores[2] + student.Scores[3]
            select totalScore;
    
        double averageScore = studentQuery6.Average();
    Console.WriteLine("Class average score = {0}", averageScore);
    

Dönüştür ya da select yan tümcesinde projesi

  1. Öğeleri kaynak sıraları içindeki öğeleri farklı bir sıra oluşturmak bir sorgu çok yaygındır.Silin veya açıklama önceki sorgu ve yürütme döngü ve aşağıdaki kod ile değiştirin.Sorgu dizeleri bir dizi döndürdüğünü unutmayın (değil Students), ve bu gerçeği yansıtılan foreach döngü.

                IEnumerable<string> studentQuery7 =
                    from student in students
                    where student.Last == "Garcia"
                    select student.First;
    
                Console.WriteLine("The Garcias in the class are:");
                foreach (string s in studentQuery7)
                {
                    Console.WriteLine(s);
                }
    
    
  2. Bu yönergede kod ortalama sınıf puanı yaklaşık 334 belirtilir.Bir dizi üretmek için Students ile birlikte sınıf ortalama değerinden daha büyük olan toplam puanı kendi Student ID, anonim bir türü kullanabilirsiniz select ifadesi:

                var studentQuery8 =
                    from student in students
                    let x = student.Scores[0] + student.Scores[1] +
                        student.Scores[2] + student.Scores[3]
                    where x > averageScore
                    select new { id = student.ID, score = x };
    
                foreach (var item in studentQuery8)
                {
                    Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);
                }
    
    

Sonraki Adımlar

C# [NULL]'ta sorgularla çalışma temel yönleri hakkında bilgi sahibi olduktan sonra belgeleri ve örnekleri belirli tür için okumak hazır LINQ ilgileniyorsanız sağlayıcı:

LINQ to SQL

LINQ to DataSet

LINQ to XML

LINQ nesnelere

Ayrıca bkz.

Görevler

İzlenecek yol: Visual Basic'te yazı sorguları

Kavramlar

LINQ sorgu ifadelerini (C# Programlama Kılavuzu)

Takıma giren LINQ kaynakları

Diğer Kaynaklar

LINQ (dil ile bütünleşik sorgu)

C# [NULL]'taki LINQ ile çalışmaya başlama