Aracılığıyla paylaş


JOIN yan tümcesi (C# Reference)

join Yan tümcesi, nesne modeli içinde doğrudan bir ilişkisi olan farklı kaynak sıraları öğelerden ilişkilendirmek için yararlıdır.Öğeleri her kaynak için eşitlik karşılaştırıldığında bazı değeri paylaşan tek gereksinimidir.Örneğin, belirli bir ürünün Tedarikçiler listesini ve alıcıların listesini yiyecek dağıtıcı olabilir.A join yan tümcesi, örneğin, satıcılar listesini oluşturmak için kullanılabilir ve tüm aynı olan alıcılar, ilgili ürünün belirtilen bölge.

A join yan tümcesi iki kaynak sıraları giriş olarak alır.Her sýradaki öðeler olması gerekir veya karşılık gelen bir sıra özelliğinde karşılaştırılabilir bir özellik içerir.join Yan tümcesi karşılaştırır eşitlik için belirtilen anahtarları özel kullanarak equals anahtar sözcüğü.Tarafından gerçekleştirilen tüm birleşimler join yan tümcesi olan equijoins.Çıkışını şeklini bir join yan tümcesi birleştirme, gerçekleştirmekte belirli türüne bağlıdır.En yaygın üç Birleşim türleri şunlardır:

  • İç birleşim

  • Grubu birleştirme

  • Sol dış birleştirme

İç birleşim

Aşağıdaki örnek, basit bir iç equijoin gösterir.Bu sorgu düz dizisini üretir "ürün adı / kategori" çiftleri.Kategori dizesi birden çok öğeleri görüntülenir.Bir öğeden, categories eşleşen hiçbir products, bu kategoriye sonuçlarında görünmez.

var innerJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID
    select new { ProductName = prod.Name, Category = category.Name }; //produces flat sequence

Daha fazla bilgi için bkz. Nasıl yapılır: iç birleşimler (C# Programlama Kılavuzu) gerçekleştirmek.

Grubu birleştirme

A join yan tümcesi ile bir into ifade Grup birleştirme denir.

var innerGroupJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    select new { CategoryName = category.Name, Products = prodGroup };

Grup birleşim sol kaynak sýradaki öðeler sağ tarafındaki kaynak sıra bir veya daha fazla eşleşen öğeleri ilişkilendiren bir hiyerarşik sonucu sırası oluşturur.Bir grup birleşim ilişkisel koşullarını hiçbir eşdeğeri vardır; Nesne dizileri aslında bir dizi var.

Sol kaynağında öğe eşleştirmek için doğru kaynak serisinden herhangi bir öğe bulunursa join yan tümcesi bu öğe için boş bir dizi üretmek.Sonuç sıra gruplar halinde düzenlenmiş dışında bu nedenle Grup katıl hala temelde iç-equijoin aynıdır.

Bir grup birleştirme sonuçlarını seçerseniz, öğelere erişebilirsiniz, ancak on eşleştir anahtar belirleyemez.Bu nedenle, önceki örnekte gösterildiği gibi anahtar adı da olan yeni bir tür grup birleştirme sonuçlarını seçin genellikle daha yararlı olur.

De, tabii ki bir grup birleştirme sonucu başka bir alt sorgu Oluşturucu kullanabilirsiniz:

var innerGroupJoinQuery2 =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    from prod2 in prodGroup
    where prod2.UnitPrice > 2.50M
    select prod2;

Daha fazla bilgi için bkz. Nasıl yapılır: gruplanmış birleşimler (C# Programlama Kılavuzu) gerçekleştirmek.

Sol dış birleştirme

Eşleşen bir öğe doğru sırada olsalar bile, bir sol dış birleştirme, sol kaynak sırasındaki tüm öğeleri, döndürülür.Bir sol dış birleşim gerçekleştirmek için LINQ, kullanma DefaultIfEmpty sol taraftaki öðesinin eşleşme varsa üretmek için bir varsayılan sağdaki öğesi belirtmek için Grup birleştirme ile birlikte yöntemi.Kullanabileceğiniz null herhangi bir başvuru için varsayılan değer olarak türü veya kullanıcı tanımlı türü belirtebilirsiniz.Aşağıdaki örnekte, varsayılan kullanıcı tanımlı türü gösterilir:

var leftOuterJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    from item in prodGroup.DefaultIfEmpty(new Product { Name = String.Empty, CategoryID = 0 })
    select new { CatName = category.Name, ProdName = item.Name };

Daha fazla bilgi için bkz. Nasıl yapılır: sol dış birleşimler (C# Programlama Kılavuzu) gerçekleştirmek.

Eşittir işleci

A join equijoin yan tümcesi gerçekleştirir.Başka bir deyişle, yalnızca temel eşleşmeleri iki anahtar eşitlik üzerinde yapabilirsiniz.Karşılaştırmaları "büyüktür" veya "eşit değil" gibi diğer türleri desteklenmez.Equijoins, tüm birleşimler olduğunu açık hale getirmek için join yan tümcesi kullanan equals yerine == işleci.equals Anahtar sözcüğü yalnızca kullanılabilir bir join yan tümcesi ve farklı == önemli bir şekilde işleci.İle equals, dış kaynak sıra sol anahtarı tüketir ve sağ tuşunu iç kaynak tüketir.Yalnızca sol tarafında kapsamdaki dış kaynak olan equals ve iç kaynak yalnızca sağ taraftaki kapsamda dizisidir.

Equijoins

Çapraz birleştirmeler ve diğer özel birleştirme işlemi olmayan-equijoins, birden çok kullanarak gerçekleştirebileceğiniz from yeni serileri bir sorguda birleştirmenize bağımsız olarak tanıtmak için yan tümceleri.Daha fazla bilgi için bkz. Nasıl yapılır: özel birleştirme (C# Programlama Kılavuzu) işlemleri.

Nesne Koleksiyonlar vs üzerinde birleştirir.İlişkisel tablolar

İçinde bir LINQ sorgu ifadesi, birleştirme işlemlerini nesne koleksiyonlarıyla gerçekleştirilir.Nesne toplulukları "ile tam olarak aynı şekilde iki ilişkisel tablolar katılamaz".De LINQ, açık join yan tümceleri, yalnızca iki kaynak sıraları tarafından herhangi bir ilişki kurulamayacak seçildiğinde gereklidir.Çalışırken LINQ to SQL, yabancı anahtar tabloların birincil tablo özellikleri olarak nesne modeli içinde temsil.Örneğin, Northwind veritabanındaki Müşteri tablosuna bir yabancı anahtar ilişkisi tablosuyla Siparişler tablosu vardır.Nesne modeli tabloları eşlediğinizde, müşteri sınıf bu müşteriyle ilişkili siparişleri derlemesini içeren bir Siparişler özelliğine sahiptir.Gerçekte, birleştirme sizin için yapmış olduğu.

Bağlamında ilişkili tablolar arasında sorgulama hakkında daha fazla bilgi için LINQ to SQL, bkz: Representing Database Relationships (LINQ to SQL).

Bileşik anahtar

Bileşik anahtar kullanılarak birden çok değer eşitlik için test edebilirsiniz.Daha fazla bilgi için bkz. Nasıl yapılır: birleştirme kullanarak bileşik anahtarları (C# Programlama Kılavuzu).Bileşik anahtarları da kullanılabilir bir group yan tümcesi.

Örnek

Aşağıdaki örnek, aynı eşleşen anahtarları kullanarak bir iç birleşim, gruba katılma ve aynı veri kaynakları üzerinde sol dış birleştirme sonuçlarını karşılaştırır.Bazı ek kod konsol sonuçları açıklığa kavuşturmak amacıyla bu örnekleri eklenir.

class JoinDemonstration
{
    #region Data

    class Product
    {
        public string Name { get; set; }
        public int CategoryID { get; set; }
    }

    class Category
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

    // Specify the first data source.
    List<Category> categories = new List<Category>()
    { 
        new Category(){Name="Beverages", ID=001},
        new Category(){ Name="Condiments", ID=002},
        new Category(){ Name="Vegetables", ID=003},
        new Category() {  Name="Grains", ID=004},
        new Category() {  Name="Fruit", ID=005}            
    };

    // Specify the second data source.
    List<Product> products = new List<Product>()
   {
      new Product{Name="Cola",  CategoryID=001},
      new Product{Name="Tea",  CategoryID=001},
      new Product{Name="Mustard", CategoryID=002},
      new Product{Name="Pickles", CategoryID=002},
      new Product{Name="Carrots", CategoryID=003},
      new Product{Name="Bok Choy", CategoryID=003},
      new Product{Name="Peaches", CategoryID=005},
      new Product{Name="Melons", CategoryID=005},
    };
    #endregion


    static void Main(string[] args)
    {
        JoinDemonstration app = new JoinDemonstration();

        app.InnerJoin();
        app.GroupJoin();
        app.GroupInnerJoin();
        app.GroupJoin3();
        app.LeftOuterJoin();
        app.LeftOuterJoin2();

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

    void InnerJoin()
    {
        // Create the query that selects 
        // a property from each element.
        var innerJoinQuery =
           from category in categories
           join prod in products on category.ID equals prod.CategoryID
           select new { Category = category.ID, Product = prod.Name };

        Console.WriteLine("InnerJoin:");
        // Execute the query. Access results 
        // with a simple foreach statement.
        foreach (var item in innerJoinQuery)
        {
            Console.WriteLine("{0,-10}{1}", item.Product, item.Category);
        }
        Console.WriteLine("InnerJoin: {0} items in 1 group.", innerJoinQuery.Count());
        Console.WriteLine(System.Environment.NewLine);

    }

    void GroupJoin()
    {
        // This is a demonstration query to show the output
        // of a "raw" group join. A more typical group join
        // is shown in the GroupInnerJoin method.
        var groupJoinQuery =
           from category in categories
           join prod in products on category.ID equals prod.CategoryID into prodGroup
           select prodGroup;

        // Store the count of total items (for demonstration only).
        int totalItems = 0;

        Console.WriteLine("Simple GroupJoin:");

        // A nested foreach statement is required to access group items.
        foreach (var prodGrouping in groupJoinQuery)
        {
            Console.WriteLine("Group:");
            foreach (var item in prodGrouping)
            {
                totalItems++;
                Console.WriteLine("   {0,-10}{1}", item.Name, item.CategoryID);
            }
        }
        Console.WriteLine("Unshaped GroupJoin: {0} items in {1} unnamed groups", totalItems, groupJoinQuery.Count());
        Console.WriteLine(System.Environment.NewLine);
    }

    void GroupInnerJoin()
    {
        var groupJoinQuery2 =
            from category in categories
            orderby category.ID
            join prod in products on category.ID equals prod.CategoryID into prodGroup
            select new
            {
                Category = category.Name,
                Products = from prod2 in prodGroup
                           orderby prod2.Name
                           select prod2
            };

        //Console.WriteLine("GroupInnerJoin:");
        int totalItems = 0;

        Console.WriteLine("GroupInnerJoin:");
        foreach (var productGroup in groupJoinQuery2)
        {
            Console.WriteLine(productGroup.Category);
            foreach (var prodItem in productGroup.Products)
            {
                totalItems++;
                Console.WriteLine("  {0,-10} {1}", prodItem.Name, prodItem.CategoryID);
            }
        }
        Console.WriteLine("GroupInnerJoin: {0} items in {1} named groups", totalItems, groupJoinQuery2.Count());
        Console.WriteLine(System.Environment.NewLine);
    }

    void GroupJoin3()
    {

        var groupJoinQuery3 =
            from category in categories
            join product in products on category.ID equals product.CategoryID into prodGroup
            from prod in prodGroup
            orderby prod.CategoryID
            select new { Category = prod.CategoryID, ProductName = prod.Name };

        //Console.WriteLine("GroupInnerJoin:");
        int totalItems = 0;

        Console.WriteLine("GroupJoin3:");
        foreach (var item in groupJoinQuery3)
        {
            totalItems++;
            Console.WriteLine("   {0}:{1}", item.ProductName, item.Category);
        }

        Console.WriteLine("GroupJoin3: {0} items in 1 group", totalItems, groupJoinQuery3.Count());
        Console.WriteLine(System.Environment.NewLine);
    }

    void LeftOuterJoin()
    {
        // Create the query.
        var leftOuterQuery =
           from category in categories
           join prod in products on category.ID equals prod.CategoryID into prodGroup
           select prodGroup.DefaultIfEmpty(new Product() { Name = "Nothing!", CategoryID = category.ID });

        // Store the count of total items (for demonstration only).
        int totalItems = 0;

        Console.WriteLine("Left Outer Join:");

        // A nested foreach statement  is required to access group items
        foreach (var prodGrouping in leftOuterQuery)
        {
            Console.WriteLine("Group:", prodGrouping.Count());
            foreach (var item in prodGrouping)
            {
                totalItems++;
                Console.WriteLine("  {0,-10}{1}", item.Name, item.CategoryID);
            }
        }
        Console.WriteLine("LeftOuterJoin: {0} items in {1} groups", totalItems, leftOuterQuery.Count());
        Console.WriteLine(System.Environment.NewLine);
    }

    void LeftOuterJoin2()
    {
        // Create the query.
        var leftOuterQuery2 =
           from category in categories
           join prod in products on category.ID equals prod.CategoryID into prodGroup
           from item in prodGroup.DefaultIfEmpty()
           select new { Name = item == null ? "Nothing!" : item.Name, CategoryID = category.ID };

        Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", leftOuterQuery2.Count());
        // Store the count of total items
        int totalItems = 0;

        Console.WriteLine("Left Outer Join 2:");

        // Groups have been flattened.
        foreach (var item in leftOuterQuery2)
        {
            totalItems++;
            Console.WriteLine("{0,-10}{1}", item.Name, item.CategoryID);
        }
        Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", totalItems);
    }
}
/*Output:

InnerJoin:
Cola      1
Tea       1
Mustard   2
Pickles   2
Carrots   3
Bok Choy  3
Peaches   5
Melons    5
InnerJoin: 8 items in 1 group.


Unshaped GroupJoin:
Group:
    Cola      1
    Tea       1
Group:
    Mustard   2
    Pickles   2
Group:
    Carrots   3
    Bok Choy  3
Group:
Group:
    Peaches   5
    Melons    5
Unshaped GroupJoin: 8 items in 5 unnamed groups


GroupInnerJoin:
Beverages
    Cola       1
    Tea        1
Condiments
    Mustard    2
    Pickles    2
Vegetables
    Bok Choy   3
    Carrots    3
Grains
Fruit
    Melons     5
    Peaches    5
GroupInnerJoin: 8 items in 5 named groups


GroupJoin3:
    Cola:1
    Tea:1
    Mustard:2
    Pickles:2
    Carrots:3
    Bok Choy:3
    Peaches:5
    Melons:5
GroupJoin3: 8 items in 1 group


Left Outer Join:
Group:
    Cola      1
    Tea       1
Group:
    Mustard   2
    Pickles   2
Group:
    Carrots   3
    Bok Choy  3
Group:
    Nothing!  4
Group:
    Peaches   5
    Melons    5
LeftOuterJoin: 9 items in 5 groups


LeftOuterJoin2: 9 items in 1 group
Left Outer Join 2:
Cola      1
Tea       1
Mustard   2
Pickles   2
Carrots   3
Bok Choy  3
Nothing!  4
Peaches   5
Melons    5
LeftOuterJoin2: 9 items in 1 group
Press any key to exit.
*/

Notlar

A join tarafından izlenmeyen yan into içine çevrilmiş bir Join yöntemi çağrısı.A join tarafından izlenen yan into için çevrilen bir GroupJoin yöntemi çağrısı.

Ayrıca bkz.

Görevler

Nasıl yapılır: sol dış birleşimler (C# Programlama Kılavuzu) gerçekleştirmek

Nasıl yapılır: iç birleşimler (C# Programlama Kılavuzu) gerçekleştirmek

Nasıl yapılır: gruplanmış birleşimler (C# Programlama Kılavuzu) gerçekleştirmek

Nasıl yapılır: birleştirme yan tümcesi (C# Programlama Kılavuzu) sonuçları

Nasıl yapılır: birleştirme kullanarak bileşik anahtarları (C# Programlama Kılavuzu)

Nasıl yapılır: örnek veritabanları yükleme

Başvuru

GROUP BY (C# Reference)

Kavramlar

LINQ sorgu ifadelerini (C# Programlama Kılavuzu)

Birleşim işlemleri

Diğer Kaynaklar

Sorgu anahtar sözcükler (C# Reference)