Aracılığıyla paylaş


Rehber: İlişkiler Arasında Sorgulama (C#)

Bu izlenecek yol, veritabanındaki yabancı anahtar ilişkilerini temsil etmek için LINQ to SQL ilişkilendirmelerinin kullanımını gösterir.

Uyarı

Bilgisayarınız, aşağıdaki yönergelerde bazı Visual Studio kullanıcı arabirimi öğeleri için farklı adlar veya konumlar gösterebilir. Sahip olduğunuz Visual Studio sürümü ve kullandığınız ayarlar bu öğeleri belirler. Daha fazla bilgi için bkz. IDE'yi Kişiselleştirme.

Bu kılavuz Visual C# Geliştirme Ayarları kullanılarak yazılmıştır.

Önkoşullar

İzlenecek Yol: Basit Nesne Modeli ve Sorgu (C#) işlemini tamamlamış olmanız gerekir. Bu kılavuz, c:\linqtest5'te northwnd.mdf dosyasının bulunmasını da içeren önceki kılavuzun üzerine inşa edilmiştir.

Genel Bakış

Bu izlenecek yol üç ana görevden oluşur:

  • Örnek Northwind veritabanında Orders tablosunu temsil eden bir varlık sınıfı ekleme.

  • İlişkiyi geliştirmek amacıyla Customer sınıfına, Customer ve Order sınıfları arasındaki ek açıklamalar ekleme.

  • sınıfını kullanarak Order bilgi almayı Customer test etmek için sorgu oluşturma ve çalıştırma.

Tablolar Arasında İlişkileri Eşleme

Sınıf tanımı Customer oluşturulduktan sonra, Order varlık sınıfı tanımını oluşturun ve bu tanımda Order.Customer'nin, Customer.CustomerID ile yabancı anahtar olarak ilişkili olduğunu gösteren aşağıdaki kodu ekleyin.

Order varlık sınıfını eklemek için

  • Customer sınıfının ardından aşağıdaki kodu yazın veya yapıştırın.

    [Table(Name = "Orders")]
    public class Order
    {
        private int _OrderID = 0;
        private string _CustomerID;
        private EntityRef<Customer> _Customer;
        public Order() { this._Customer = new EntityRef<Customer>(); }
    
        [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
        IsPrimaryKey = true, IsDbGenerated = true)]
        public int OrderID
        {
            get { return this._OrderID; }
            // No need to specify a setter because IsDBGenerated is
            // true.
        }
    
        [Column(Storage = "_CustomerID", DbType = "NChar(5)")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }
    
        [Association(Storage = "_Customer", ThisKey = "CustomerID")]
        public Customer Customer
        {
            get { return this._Customer.Entity; }
            set { this._Customer.Entity = value; }
        }
    }
    

Müşteri Sınıfına Açıklama Ekleme

Bu adımda, Customer sınıfına Order sınıfıyla olan ilişkisini göstermek için etiketleme yaparsınız. (İlişkiyi her iki yönde tanımlamak bağlantıyı oluşturmak için yeterli olduğundan bu ekleme kesinlikle gerekli değildir. Ancak bu ek açıklamayı eklemek, nesnelerde her iki yönde de kolayca gezinmenizi sağlar.)

Customer sınıfına açıklama eklemek için

  • Sınıfına aşağıdaki kodu yazın veya yapıştırın Customer :

    private EntitySet<Order> _Orders;
    public Customer()
    {
        this._Orders = new EntitySet<Order>();
    }
    
    [Association(Storage = "_Orders", OtherKey = "CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    }
    

Customer-Order İlişkisinde Sorgu Oluşturma ve Çalıştırma

Artık Order nesnelere doğrudan Customer nesnelerden veya ters sırada erişebilirsiniz. Müşteriler ve siparişler arasında açık bir birleşime ihtiyacınız yoktur.

Order nesnelerine erişmek için Müşteri nesnelerini kullanmak

  1. yöntemine Main aşağıdaki kodu yazarak veya yapıştırarak yöntemini değiştirin:

    // Query for customers who have placed orders.
    var custQuery =
        from cust in Customers
        where cust.Orders.Any()
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID,
            custObj.Orders.Count);
    }
    
  2. Uygulamanızda hata ayıklamak için F5 tuşuna basın.

    Uyarı

    Açıklama satırı yaparak db.Log = Console.Out;Konsol penceresinde SQL kodunu ortadan kaldırabilirsiniz.

  3. Hata ayıklamayı durdurmak için Konsol penceresinde Enter tuşuna basın.

Veritabanınızın Güçlü Tipte Bir Görünümünü Oluşturma

Veritabanınızın kesin olarak belirlenmiş bir görünümüyle başlamak çok daha kolaydır. Nesneyi güçlü bir şekilde DataContext yazarak GetTable çağrı yapmanıza gerek kalmaz. Kesin tip tanımlı DataContext nesneyi kullandığınızda, tüm sorgularınızda kesin tip tanımlı tabloları kullanabilirsiniz.

Aşağıdaki adımlarda, veritabanındaki Müşteriler tablosuyla eşleşen, belirli bir türe sahip bir tablo olarak Customers oluşturacaksınız.

DataContext nesnesini kesin olarak yazmak için

  1. Sınıf bildiriminin Customer üzerine aşağıdaki kodu ekleyin.

    public class Northwind : DataContext
    {
        // Table<T> abstracts database details per table/data type.
        public Table<Customer> Customers;
        public Table<Order> Orders;
    
        public Northwind(string connection) : base(connection) { }
    }
    
  2. Main yöntemini aşağıdaki gibi kesin olarak yazılanı DataContext kullanacak şekilde değiştirin:

    // Use a connection string.
    Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf");
    
    // Query for customers from Seattle.
    var custQuery =
        from cust in db.Customers
        where cust.City == "Seattle"
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine($"ID={custObj.CustomerID}");
    }
    // Freeze the console window.
    Console.ReadLine();
    
  3. Uygulamanızda hata ayıklamak için F5 tuşuna basın.

    Konsol penceresi çıkışı şöyledir:

    ID=WHITC

  4. Hata ayıklamayı durdurmak için konsol penceresinde Enter tuşuna basın.

Sonraki Adımlar

Sonraki izlenecek yol (İzlenecek Yol: Verileri Düzenleme (C#)) verileri işlemeyi gösterir. Bu izlenecek yol, daha önce tamamlamış olduğunuz bu serideki iki kılavuzu kaydetmenizi gerektirmez.

Ayrıca bakınız