from tümcesi (C# Başvurusu)

Sorgu ifadesi bir from yan tümceyle başlamalıdır. Ayrıca sorgu ifadesi, yan tümcesiyle from de başlayan alt sorgular içerebilir. from yan tümcesi aşağıdakileri belirtir:

  • Sorgunun veya alt sorgunun çalıştırılacağı veri kaynağı.

  • Kaynak dizideki her öğeyi temsil eden bir yerel aralık değişkeni .

Hem aralık değişkeni hem de veri kaynağı kesin olarak yazıldı. yan tümcesinde from başvuruda bulunan veri kaynağının IEnumerabletürü , IEnumerable<T>veya gibi IQueryable<T>türetilmiş bir tür olmalıdır.

Aşağıdaki örnekte, numbers veri kaynağı ve num aralık değişkenidir. var anahtar sözcüğü kullanılmış olsa bile her iki değişkenin de kesin olarak yazıldığını unutmayın.

class LowNums
{
    static void Main()
    {
        // A simple data source.
        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        // Create the query.
        // lowNums is an IEnumerable<int>
        var lowNums = from num in numbers
            where num < 5
            select num;

        // Execute the query.
        foreach (int i in lowNums)
        {
            Console.Write(i + " ");
        }
    }
}
// Output: 4 1 3 2 0

Aralık değişkeni

Derleyici, veri kaynağı uyguladığında aralık değişkeninin türünü çıkarsar IEnumerable<T>. Örneğin, kaynak türüne IEnumerable<Customer>sahipse, aralık değişkeni olarak çıkarılır Customer. Türü açıkça belirtmeniz gereken tek zaman, kaynağın gibi ArrayListgenel IEnumerable olmayan bir tür olmasıdır. Daha fazla bilgi için bkz. LINQ ile ArrayList sorgulama.

Önceki örnekte num türünde intolduğu çıkarılır. Aralık değişkeni kesin olarak yazıldığı için, üzerinde yöntemleri çağırabilir veya diğer işlemlerde kullanabilirsiniz. Örneğin, yazmak select numyerine, sorgu ifadesinin tamsayılar yerine dize dizisi döndürmesine neden olmak için yazabilirsiniz select num.ToString() . Ya da ifadenin 14, 11, 13, 12, 10 dizisini döndürmesine neden olmak için yazabilirsiniz select num + 10 . Daha fazla bilgi için bkz. seçme yan tümcesi.

Aralık değişkeni, çok önemli bir fark dışında foreach deyimindeki yineleme değişkeni gibidir: aralık değişkeni asla kaynaktan veri depolamaz. Bu, sorgu yürütülürken ne olacağını açıklamak için sorguyu sağlayan söz dizimsel bir kolaylıktır. Daha fazla bilgi için bkz. LINQ Sorgularına Giriş (C#).

Yan tümcelerden bileşik

Bazı durumlarda, kaynak dizideki her öğe bir dizi olabilir veya bir dizi içerebilir. Örneğin, veri kaynağınız dizideki her öğrenci nesnesinin bir test puanı listesi içerdiği bir yer olabilir IEnumerable<Student> . Her Student öğenin içindeki iç listeye erişmek için bileşik from yan tümceleri kullanabilirsiniz. Teknik, iç içe foreach deyimlerini kullanmaya benzer. Sonuçları filtrelemek için her iki from yan tümceye where veya orderby yan tümceleri ekleyebilirsiniz. Aşağıdaki örnekte, her biri Student test puanlarını temsil eden tamsayıların iç List kısmını içeren bir nesne dizisi gösterilmektedir. İç listeye erişmek için bileşik from yan tümcesi kullanın. Gerekirse iki from yan tümce arasına yan tümceler ekleyebilirsiniz.

class CompoundFrom
{
    // The element type of the data source.
    public class Student
    {
        public string LastName { get; set; }
        public List<int> Scores {get; set;}
    }

    static void Main()
    {

        // Use a collection initializer to create the data source. Note that
        // each element in the list contains an inner sequence of scores.
        List<Student> students = new List<Student>
        {
           new Student {LastName="Omelchenko", Scores= new List<int> {97, 72, 81, 60}},
           new Student {LastName="O'Donnell", Scores= new List<int> {75, 84, 91, 39}},
           new Student {LastName="Mortensen", Scores= new List<int> {88, 94, 65, 85}},
           new Student {LastName="Garcia", Scores= new List<int> {97, 89, 85, 82}},
           new Student {LastName="Beebe", Scores= new List<int> {35, 72, 91, 70}}
        };

        // Use a compound from to access the inner sequence within each element.
        // Note the similarity to a nested foreach statement.
        var scoreQuery = from student in students
                         from score in student.Scores
                            where score > 90
                            select new { Last = student.LastName, score };

        // Execute the queries.
        Console.WriteLine("scoreQuery:");
        // Rest the mouse pointer on scoreQuery in the following line to
        // see its type. The type is IEnumerable<'a>, where 'a is an
        // anonymous type defined as new {string Last, int score}. That is,
        // each instance of this anonymous type has two members, a string
        // (Last) and an int (score).
        foreach (var student in scoreQuery)
        {
            Console.WriteLine("{0} Score: {1}", student.Last, student.score);
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/*
scoreQuery:
Omelchenko Score: 97
O'Donnell Score: 91
Mortensen Score: 94
Garcia Score: 97
Beebe Score: 91
*/

Birleşim gerçekleştirmek için Birden Çok from Yan Tümcesi Kullanma

Bileşik from yan tümcesi, tek bir veri kaynağındaki iç koleksiyonlara erişmek için kullanılır. Ancak, sorgu bağımsız veri kaynaklarından ek sorgular oluşturan birden çok from yan tümce de içerebilir. Bu teknik, join yan tümcesini kullanarak mümkün olmayan belirli türlerde birleştirme işlemleri gerçekleştirmenizi sağlar.

Aşağıdaki örnek, iki from yan tümcenin iki veri kaynağının tam çapraz birleşimini oluşturmak için nasıl kullanılabileceğini gösterir.

class CompoundFrom2
{
    static void Main()
    {
        char[] upperCase = { 'A', 'B', 'C' };
        char[] lowerCase = { 'x', 'y', 'z' };

        // The type of joinQuery1 is IEnumerable<'a>, where 'a
        // indicates an anonymous type. This anonymous type has two
        // members, upper and lower, both of type char.
        var joinQuery1 =
            from upper in upperCase
            from lower in lowerCase
            select new { upper, lower };

        // The type of joinQuery2 is IEnumerable<'a>, where 'a
        // indicates an anonymous type. This anonymous type has two
        // members, upper and lower, both of type char.
        var joinQuery2 =
            from lower in lowerCase
            where lower != 'x'
            from upper in upperCase
            select new { lower, upper };

        // Execute the queries.
        Console.WriteLine("Cross join:");
        // Rest the mouse pointer on joinQuery1 to verify its type.
        foreach (var pair in joinQuery1)
        {
            Console.WriteLine("{0} is matched to {1}", pair.upper, pair.lower);
        }

        Console.WriteLine("Filtered non-equijoin:");
        // Rest the mouse pointer over joinQuery2 to verify its type.
        foreach (var pair in joinQuery2)
        {
            Console.WriteLine("{0} is matched to {1}", pair.lower, pair.upper);
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
        Cross join:
        A is matched to x
        A is matched to y
        A is matched to z
        B is matched to x
        B is matched to y
        B is matched to z
        C is matched to x
        C is matched to y
        C is matched to z
        Filtered non-equijoin:
        y is matched to A
        y is matched to B
        y is matched to C
        z is matched to A
        z is matched to B
        z is matched to C
        */

Birden çok from yan tümce kullanan birleştirme işlemleri hakkında daha fazla bilgi için bkz. Sol dış birleşimleri gerçekleştirme.

Ayrıca bkz.