DLINQ その2

前に続けてDLINQでJoinしたときには、どんなSQL文が流れるのか?

テーブルはこんなの。名前は適当

hd
-----------
id(pkey)
data

bd
-----------
id(pkey)
seq(pkey)
data

ついでにInsertとDeleteも調べる。
下のサンプルの前半でデータ消してInsertもしてる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            DataClasses1DataContext dc = new DataClasses1DataContext(
                "Data Source=Gerbera;Initial Catalog=recordings;User ID=sa;Password=p");

            //dc.hd.ToList().ForEach(
            //    h => dc.hd.DeleteOnSubmit(h));
            //dc.bd.ToList().ForEach(
            //    b => dc.bd.DeleteOnSubmit(b));
            dc.hd.DeleteAllOnSubmit(dc.hd);
            dc.bd.DeleteAllOnSubmit(dc.bd);

            dc.SubmitChanges();

            Enumerable.Range(0, 10).ToList().ForEach(
                i =>
                {
                    hd hd = new hd();
                    hd.id = i;
                    hd.data = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

                    dc.hd.InsertOnSubmit(hd);

                    Enumerable.Range(0, 2).ToList().ForEach(
                        j =>
                        {
                            bd bd = new bd();
                            bd.id = i;
                            bd.seq = j;
                            bd.data = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                            dc.bd.InsertOnSubmit(bd);
                        });
                });
                    
            dc.SubmitChanges();

            var rtn = from h in dc.hd
                      join b in dc.bd on h.id equals b.id
                      select new {hid = h.id,hdata = h.data,bseq = b.seq , bdata = b.data};

            foreach(var r in rtn)
            {
                Console.WriteLine("{0},{1},{2},{3}",
                    r.hid,
                    r.hdata,
                    r.bseq,
                    r.bdata);
            }
            Console.ReadKey();
        }
    }
}

これを動かしたときに流れるSQL文がこれ。

SELECT [t0].[id] AS [hid], [t0].[data] AS [hdata], [t1].[seq] AS [bseq], [t1].[data] AS [bdata]
FROM [dbo].[hd] AS [t0]
INNER JOIN [dbo].[bd] AS [t1] ON [t0].[id] = [t1].[id]

ちゃんとJoinしてくれている。