O/R インピーダンスミスマッチ LINQ to SQL

[雑記] O/R インピーダンスミスマッチ(LINQ to SQL の概念説明) (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp3_ormismatch.html
概要、O/Rインピーダンスミスマッチ、OOPのクラスとRDBのテーブル、OOPの階層的データ構造とRDBのテーブル結合、LINQ to SQL


インピーダンスミスマッチとは、コンセプトの異なる2つの分野を繋ぐときの困難さ。
O/RはObject/Relationalのことで、OOPRDBのこと。


OOPのクラスとRDBのテーブルには大きな差は生まれない。
問題は、複数のテーブルの関係性を表す時に生じる。RDBでは階層性がない代わりに、テーブル結合を使ってデータを取り出す。


どうやってLINQ to SQLではミスマッチを解決してるかの概要
Entity, DataContext, IQueryableとクエリ式、Association


Entity
まずRDBのテーブルにあたるクラスをつくる。これをEntity(実体)クラスという。
Entityクラスには、Table属性を、メンバー(テーブルの列にあたる)にはColumn属性をつける。

using System.Data.Linq.Mapping;

[Table(Name = "Authors")]
public class Author
{
  [Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]
  public int Id;
  [Column]
  public string Name;
  [Column]
  public DateTime? Birthday;
  [Column]
  public string Url;
}

EntityクラスはIQueryableを実装している。


DataContext
RDBのサーバに接続するためのクラスをつくる。DataContextクラスという。

using System.Data.Linq;

public class ComicDataContext : DataContext
{
  public ComicDataContext(string connectionString)
    : base(connectionString)
  {
  }

  public Table<Author> Author;
  public Table<Series> Series;
}


Association 2つのテーブルの関連性の記述
具体的には、Entityクラスのメンバーとして、Association属性のついたものを定義する。