Aracılığıyla paylaş


Tablolar Arası Sorgular (LINQ to DataSet)

Tek bir tabloyu sorgulamaya ek olarak, LINQ to DataSet'te tablolar arası sorgular da gerçekleştirebilirsiniz. Bu, birleştirme kullanılarak yapılır. Birleştirme, bir veri kaynağındaki nesnelerin, ürün veya kişi kimliği gibi başka bir veri kaynağında ortak bir özniteliği paylaşan nesnelerle ilişkisidir. Nesne odaklı programlamada, her nesnenin başka bir nesneye başvuran bir üyesi olduğundan nesneler arasındaki ilişkilerde gezinmek nispeten kolaydır. Ancak dış veritabanı tablolarında ilişkilerde gezinmek o kadar kolay değildir. Veritabanı tabloları yerleşik ilişkiler içermez. Bu gibi durumlarda, birleştirme işlemi her kaynaktaki öğeleri eşleştirmek için kullanılabilir. Örneğin, ürün bilgileri ve satış bilgileri içeren iki tablo göz önüne alındığında, aynı satış siparişinin satış bilgileri ve ürünleriyle eşleştirmek için birleştirme işlemi kullanabilirsiniz.

DilLe Tümleşik Sorgu (LINQ) çerçevesi iki birleştirme işleci Join sağlar ve GroupJoin. Bu işleçler, yalnızca anahtarları eşit olduğunda iki veri kaynağıyla eşleşen birleşimler olan eş birleşimler gerçekleştirir. (Buna karşılık Transact-SQL, işleç gibi dışındaki equalsbirleştirme işleçlerini less than destekler.)

İlişkisel veritabanı terimlerinde iç Join birleşim uygular. İç birleşim, yalnızca karşı veri kümesinde eşleşmesi olan nesnelerin döndürüldiği birleştirme türüdür.

İşleçlerin GroupJoin ilişkisel veritabanı terimlerinde doğrudan eşdeğeri yoktur; iç birleşimlerin ve sol dış birleşimlerin üst kümesini uygularlar. Sol dış birleşim, ikinci koleksiyonda bağıntılı öğe olmasa bile ilk (sol) koleksiyonun her öğesini döndüren bir birleşimdir.

Birleştirmeler hakkında daha fazla bilgi için bkz . Birleştirme İşlemleri.

Örnek

Aşağıdaki örnek, Ağustos ayından SalesOrderHeader itibaren çevrimiçi siparişler almak için AdventureWorks örnek veritabanından ve SalesOrderDetail tablolarının geleneksel bir birleşimini gerçekleştirir.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];

var query =
    from order in orders.AsEnumerable()
    join detail in details.AsEnumerable()
    on order.Field<int>("SalesOrderID") equals
        detail.Field<int>("SalesOrderID")
    where order.Field<bool>("OnlineOrderFlag") == true
    && order.Field<DateTime>("OrderDate").Month == 8
    select new
    {
        SalesOrderID =
            order.Field<int>("SalesOrderID"),
        SalesOrderDetailID =
            detail.Field<int>("SalesOrderDetailID"),
        OrderDate =
            order.Field<DateTime>("OrderDate"),
        ProductID =
            detail.Field<int>("ProductID")
    };

foreach (var order in query)
{
    Console.WriteLine("{0}\t{1}\t{2:d}\t{3}",
        order.SalesOrderID,
        order.SalesOrderDetailID,
        order.OrderDate,
        order.ProductID);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
    From order In orders.AsEnumerable() _
    Join detail In details.AsEnumerable() _
    On order.Field(Of Integer)("SalesOrderID") Equals _
            detail.Field(Of Integer)("SalesOrderID") _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
            order.Field(Of DateTime)("OrderDate").Month = 8 _
    Select New With _
    { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .ProductID = detail.Field(Of Integer)("ProductID") _
    }

For Each order In query
    Console.WriteLine(order.SalesOrderID & vbTab & _
        order.SalesOrderDetailID & vbTab & _
        order.OrderDate & vbTab & _
        order.ProductID)
Next

Ayrıca bkz.