OracleでLINQ to SQL

ちょっと調べた限りでは、LINQ to SQLOracleに対応していないようです。私はSQL Serverがさっぱりなので、これではLINQ to SQLで遊べません。(^^; 悔しいので、ググってみたら、http://code2code.net/DB_Linq/というものを発見しました。素のままのLINQ to SQLにくらべて手間は増えますが、これで行けそうな感じです。
手順

  1. 上記サイトからソースコードをダウンロードし、ビルドします。今回はOracleなのでDbLinq_OracleOnly.slnを使います。すると、DBLinq.Oracle.Prototype.dllが作成されます。
  2. 次にサンプルプロジェクトを用意して、先ほどのアセンブリを参照に追加します。
  3. 以下のコードを打ち込みます。もし、ユーザ、パスワードをscott/tigerから変更している場合は、適宜修正してください。
using System;
using System.Linq;
using System.Data.Linq.Mapping;
using DBLinq.Linq;

namespace DBLinqForOracle
{
    /// <summary>
    /// データベース。
    /// </summary>
    /// <remarks>
    /// MContextは抽象クラスなので、必ず具象クラスを用意する必要がある。
    /// </remarks>
    class OracleDB : MContext
    {
        public OracleDB(string conn) : base(conn) {
            Employees = new MTable<Employee>(this);
        }

        public readonly MTable<Employee> Employees;
    }

    [Table(Name="EMP")]
    public class Employee : IModified
    {
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <remarks>
        /// デフォルトコンストラクタとフィールドの初期値を取るコンストラクタの両方が必須。
        /// </remarks>
        public Employee() { }
        public Employee(decimal no, string name)
        {
            this.No = no;
            this.Name = name;
        }

        private decimal no;
        [Column(Name="EMPNO")]
        public decimal No
        {
            get { return no; }
            set { no = value; IsModified = true; }
        }

        private string name;
        [Column(Name="ENAME")]
        public string Name
        {
            get { return name; }
            set { name = value; IsModified = true; }
        }

        #region IModified Members

        public bool IsModified
        {
            get;
            set;
        }

        #endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            OracleDB db = new OracleDB("Data Source=orcl;User Id=scott;Password=tiger");

            var Employees = db.Employees;
            var q = from e in Employees
                    where e.No > 7500
                    select e;
            foreach (var e in q)
                Console.WriteLine("{0}, {1}", e.No, e.Name);
        }
    }
}

/* 結果
7521, WARD
7566, JONES
7654, MARTIN
7698, BLAKE
7782, CLARK
7788, SCOTT
7839, KING
7844, TURNER
7876, ADAMS
7900, JAMES
7902, FORD
7934, MILLER
 */

という訳で検索ができました。更新系は、また別の機会に。

自分用メモ。
http://www.microsoft.com/japan/msdn/net/bb425822.aspx