from tümcesi (C# Başvurusu)

Sorgu ifadesinin bir yan tümcesi ile başlaması from gerekir. Ayrıca, bir sorgu ifadesi yan tümcesi ile başlayan alt sorgular from içerebilir. yan from tümcesi şunları belirtir:

  • Sorgunun veya alt sorgunun çalıştırıla 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 başvurulan from veri kaynağının türü , IEnumerable veya gibi türetilmiş bir IEnumerable<T> türe sahip olması IQueryable<T> gerekir.

Aşağıdaki örnekte veri numbers kaynağı ve aralık num değişkenidir. var anahtar sözcüğü kullanılıyor olsa bile her iki değişkenin de kesin olarak yazıldıkları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ğı uygulayan aralık değişkeninin türünü IEnumerable<T> çıkartır. Örneğin, kaynağın türüne IEnumerable<Customer> sahipse, aralık değişkeninin olması Customer gerekir. Türü açıkça belirtmeniz gereken tek zaman, kaynağın gibi genel olmayan bir IEnumerable tür ArrayList olmasıdır. Daha fazla bilgi için bkz. LINQ ile ArrayList sorgulama.

Önceki örnekte num türünde olduğu doğrularak. int Aralık değişkeni kesin türe sahip olduğundan, üzerinde yöntemler çağırarak veya diğer işlemlerde kullanabilirsiniz. Örneğin, yazmak yerine, sorgu ifadesinin tamsayılar yerine dize dizisi dönmesine neden select num olmak için select num.ToString() yazabilirsiniz. Veya ifadenin select num + 10 14, 11, 13, 12, 10 dizisini dönmesine neden olmak için yazabilir. Daha fazla bilgi için bkz. select yan tümcesi.

Aralık değişkeni, çok önemli bir fark dışında foreach deyiminde bir yineleme değişkenine benzer: aralık değişkeni hiçbir zaman kaynaktan veri depolamaz. Bu, sorgu yürütülürken ne olduğunu sorgunun açıklamasına olanak sağlayan tek birntactic 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, dizide yer alan her öğrenci nesnesinin bir IEnumerable<Student> test puanı listesi içerdiği bir veri kaynağı olabilir. Her öğenin içindeki iç listeye Student erişmek için bileşik yan tümceleri from kullanabilirsiniz. Bu teknik, iç içe foreach deyimleri kullanmaya benzer. Sonuçları filtrelemek için her iki yan tümcesine where veya orderby yan from tümceleri eklemeniz gerekir. Aşağıdaki örnek, her biri test puanlarını temsil eden tamsayıların iç değerini Student içeren bir nesne dizisi List gösterir. İç listeye erişmek için bileşik yan from tümcesi kullanın. Gerekirse, iki yan tümce arasına from yan tümceler ekleme.

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ştirmeler Gerçekleştirmek için Yan Tümcelerden Birden Çok Kullanma

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

Aşağıdaki örnekte iki yan tümcenin iki veri kaynağı arasında tam from bir çapraz birleşim oluşturmak için nasıl kullanılageldi?

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 yan tümcesi kullanan birleştirme işlemleri hakkında daha from fazla bilgi için bkz. Sol dış birleşimler gerçekleştirme.

Ayrıca bkz.