次の方法で共有


テーブル間クエリ (LINQ to DataSet)

1 つのテーブルに対してクエリを実行するだけでなく、LINQ to DataSet でテーブル間クエリを実行することもできます。 これは 、結合を使用して行われます。 結合とは、あるデータ ソース内のオブジェクトと、製品や連絡先 ID など、別のデータ ソースで共通の属性を共有するオブジェクトとの関連付けです。 オブジェクト指向プログラミングでは、各オブジェクトに別のオブジェクトを参照するメンバーがあるため、オブジェクト間のリレーションシップは比較的簡単に移動できます。 ただし、外部データベース テーブルでは、リレーションシップの移動は単純ではありません。 データベース テーブルには組み込みのリレーションシップが含まれていません。 このような場合、結合操作を使用して、各ソースの要素を照合できます。 たとえば、製品情報と販売情報を含む 2 つのテーブルがある場合、結合操作を使用して、同じ販売注文の販売情報と製品を照合できます。

Language-Integrated クエリ (LINQ) フレームワークには、 JoinGroupJoinの 2 つの結合演算子が用意されています。 これらの演算子は 等結合を実行します。つまり、2 つのデータ ソースに一致する結合は、キーが等しい場合にのみ実行されます。 (これに対し、Transact-SQL では、less than 演算子など、equals以外の結合演算子がサポートされます)。

リレーショナル データベースの用語では、 Join は内部結合を実装します。 内部結合とは、反対のデータ セットに一致するオブジェクトのみが返される結合の一種です。

GroupJoin演算子は、リレーショナル データベースの用語に直接相当するものはありません。内部結合と左外部結合のスーパーセットを実装します。 左外部結合は、2 番目のコレクションに相関要素がない場合でも、最初の (左) コレクションの各要素を返す結合です。

結合の詳細については、「 結合操作」を参照してください。

次の例では、AdventureWorks サンプル データベースから SalesOrderHeader テーブルと SalesOrderDetail テーブルの従来の結合を実行して、8 月からオンライン注文を取得します。

// 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($"{order.SalesOrderID}\t{order.SalesOrderDetailID}\t{order.OrderDate:d}\t{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

こちらも参照ください