<< .NET Framework 4.0 | main | [x64]Windows Server で 64bit Webアプリケーション >>

2008/12/04 (木)

LINQ を試してみる

ユーザからのQA調査で ウワサの『LINQ』を触ってみました。
SQL文と比較するとこんな感じ

  LINQ クエリ   SQL ステートメント
(1) Dim query = From MSHAIN In SHAIN_MST.AsEnumerable, MTSHAIN In SHAIN_EXT.AsEnumerable _
            Where MSHAIN.Field(Of String)("SHAIN_CD") = MTSHAIN.Field(Of String)("SHAIN_CD") _
            AndAlso MSHAIN.Field(Of String)("SHAIN_CD") = "999" _
            Select New With _
             { _
                .SHAINCD = MSHAIN.Field(Of String)("SHAIN_CD"), _
                .SHAINNM = MSHAIN.Field(Of String)("SHAIN_NM"), _
                .BUMONCD = MTSHAIN.Field(Of String)("BUMON_CD") _
             }
  SELECT
    M_SHAIN.SHAIN_CD        AS SHAINCD,
    SHAIN_MST.SHAIN_NM        AS SHAINNM,
    MT_SHAIN.BUMON_CD       AS BUMONCD
FROM SHAIN_MST MSHAIN, SHAIN_EXT MTSHAIN
WHERE MSHAIN.SHAIN_CD = MTSHAIN.SHAIN_CD
AND   MSHAIN.SHAIN_CD = '999'
(2) Dim query2 = From MSHAIN In M_SHAIN.AsEnumerable Select MSHAIN   SELECT * FROM SHAIN_MST
(3) Dim query3 = From MSHAIN In SHAIN_MST.AsEnumerable _
             Where MSHAIN.Field(Of DateTime)("BIRTHDAY") _
                  .ToString("yyyyMM").Equals("200803") _
             Select MSHAIN
  SELECT * FROM M_SHAIN
WHERE SUBSTRING(CONVERT(VARCHAR(8),BIRTHDAY,112),1,6)='200803'

LINQ to DataSet はDataSet は DataTable に対して集計やフィルタ、ソートがSQLライクな構文で実行できます。
これまでも DataView クラスの Sortプロパティ、RowFileterプロパティ、Computeメソッドを使えばこれらと同等のものは実装できますが、SQL文が理解できるならこの方が見やすいかもしれません。
(3)のようなパターンではとくに .NET Framework クラス関数が使用できるのでだんぜんわかりやすいです。

「なぜSQL文と記述の順番が違うの?」と思う人もいるかと思いますが、MSの人曰く、
「インテリセンスを表示させるのに、親オブジェクトとなるものから記述しないとコンパイラが解釈できないから」とのことだそうです。

言われてみればそうですね…って3ヶ月前Tech・Edで納得してました。