ドキュメントを読んでいて疑問に思ったところ The LINQ Project http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx dlinq_overview_for_vb_developers.doc の4ページ目 > ' DataContext takes a connection string > Dim db As DataContext = New DataContext("c:\...\northwnd.mdf") > ' Get a typed table to run queries > Dim Customers As Table(Of Customer) = db.GetTable(Of Customer)() ADO.NETでいう、ConnectionオブジェクトやDataAdapterオブジェクトを 宣言して接続する一連の操作が、LINQではDataContextを宣言して、 定義したクラスにGetTableに読み込むという手順に変わったよ、という 旨の文章のところだけど、mdfの場所をフルパスで指定している 理由が分からない。mdbならファイルなのでフルパス指定だと思うけれど、 mdfはフルパス指定じゃなくて、SQLサーバ名とデータベース名の指定 にするべきだと思う。 この理由分かる方いらっしゃいますか?
LINQはさて置いてもDLinqはまだあんまり知られてない感じだから、 ここでデモプロ1本作ってみるよ。数回の連載になるけど過疎ってるから勘弁な。 とりあえず環境はSQL2005Express+.NET3.5日本語Betaでおkすよ。VS2008なしでいける。 まずはDBを作ります。ShopとCustomerで1:nの関係。 sqlcmd -S .\sqlexpress 接続できたら create database DLinqDemo go use DLinqDemo go create table Shop (ID char(4) primary key, Name nvarchar(10)) create table Customer (ID int primary key identity, ShopID char(4) references Shop(ID), Name nvarchar(20)) go 今後このデータベースが不要になったらsqlcmdで次のコマンドをたたけば消せます。 drop database DLinqDemo
以下が基本形でDemoListのようなstaticメソッドが今後増えてくる塩梅です。 コンパイルは cs /o demo.cs DLinqDemo.cs // demo.cs using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace demo { class Demo { static readonly string conn = @"Data Source=.\sqlexpress;Initial Catalog=DLinqDemo;Integrated Security=SSPI"; static bool logFlg = false; static void Main(String [] args) { logFlg = args.Length > 0; DemoList(); } static void DemoList() { using(DLinqDemo dc = new DLinqDemo(conn)) { if (logFlg) dc.Log = Console.Out; var qr = from c in dc.Customer select c; var rs = qr.ToList(); foreach (var r in rs) Console.WriteLine("{{ {0}, {1}, {2}, {3} }}", r.ID, r.Name, r.Shop.ID, r.Shop.Name); var rs2 = from c in dc.Customer join s in dc.Shop on c.ShopID equals s.ID orderby s.ID, c.ID select new { ID = c.ID, Name = c.Name, ShopID = s.ID, ShopName = s.Name }; foreach (var r in rs2) Console.WriteLine(r); } } } }
59 :
LINQ構文が2つあるけど上段がORM風に更新可能なCustomerオブジェクトを取得している。 クエリーしてないのに関連をたどってShopの情報も取れる。 下段は普通のLINQ風の構文で更新不可。アドホックなクエリーに使う。 demo.exeに適当な引数をつけると、DLinqがどんなSQLをデータベースに投げてるか見れる。 demo.exe log データが入ってないので次回はデータを入れたいが、繰り返し実行できるように テーブルを消してしまう処理を書いておこう。 これはデータを直接生のSQLを投げて消してしまうもので、 ORMのキャッシュはスルーしてしまうので注意。あくまでも初期化用。 static void Cleanup() { using(DLinqDemo dc = new DLinqDemo(conn)) { if (logFlg) dc.Log = Console.Out; dc.ExecuteCommand("delete from Customer", new object[0]); dc.ExecuteCommand("delete from Shop", new object[0]); } }
60 :
データの登録。 shop1に対してCostomerを2件。 shop2に対してCostomerを3件追加している。 それぞれ別のやり方で登録してるから見比べて欲しい。 static void DemoAdd() { using(DLinqDemo dc = new DLinqDemo(conn)) { if (logFlg) dc.Log = Console.Out; var shop1 = new Shop() { ID = "A001", Name="WAHAHA" }; shop1.Customer.Add(new Customer() { Name="AAAA BBBB" }); shop1.Customer.Add(new Customer() { Name="AAAA CCCC" }); shop1.Customer.Add(new Customer() { Name="AAAA DDDD" }); dc.Shop.Add(shop1); var shop2 = new Shop() { ID = "A002", Name="UFUFU" }; dc.Shop.Add(shop2); dc.Customer.Add(new Customer() { Name="RRRR BBBB", Shop=shop2 }); dc.Customer.Add(new Customer() { Name="RRRR CCCC", Shop=shop2 }); dc.SubmitChanges(); } } Mainから次の順番で呼び出してくんしゃい。 Cleanup(); DemoAdd(); DemoList();
61 :
最後は変更や削除の例。ちょっと意味不明な処理だがあくまでもデモ用としてみてくれ。 static void DemoModify() { using(DLinqDemo dc = new DLinqDemo(conn)) { if (logFlg) dc.Log = Console.Out; var qr = from c in dc.Customer where c.Name == "RRRR CCCC" || c.Name == "AAAA CCCC" select c; var rs = qr.ToList(); foreach (var r in rs) { if (r.Name == "RRRR CCCC") r.Name = "YYYY CCCC*"; if (r.Name == "AAAA CCCC") dc.Customer.Remove(r); } dc.SubmitChanges(); } } 長々とすまなかった。以上だ。