SlideShare a Scribd company logo
1 of 19
LINQな世界への招待

 どっとねっとふぁん
 http://dotnetfan.org/

    小野 修司
LINQとは
• データ(オブジェクト)の集合から簡単な記述で
  『必要なオブジェクト』の『必要なメンバ』のみを
  『必要とする順序』で取り出せるようにしたシン
  タックスシュガー
 – 開発者は抽出条件、抽出するメンバ、抽出順序にのみ
   関心を払う
 – 取り出すデータの型を用意したり、繰り返し文を書い
   たりしない
    • 定型的作業のタイピングの大幅な削減

・クエリ式のサンプル:
var query = from    データ変数 in データの集合
             where   抽出条件
             orderby 抽出順序のキー項目
             select  抽出するメンバ で構成される新しいクラス;
対象となるデータ
• 配列、LIST<T>(LINQ to Object)
   – 独自に定義したオブジェクトや組み込みオブジェクトの
     集合
• XMLファイル(LINQ to XML)
   – XDocument、XElement内のオブジェクトのツリー
• データベース(LINQ to SQL)
   – DataContext経由で取り出すTable<TEntity>オブジェクト
      • 対応するのはSQL Serverのみ



• Entity Data Model(LINQ to Entities)
   – Entity Frameworkによって生成されるオブジェクト
      • Entity Frameworkは.NET Framework 3.5のリリースには含まれて
        いない
クエリ式の仕様
• from句からはじまる
• from、let、where、join、orderbyを内部に
  記述
• select句またはgroup句で終わる

• add/update/deleteは仕様として存在しない
 – データを抽出することが目的
SQL文との違い
• 抽出条件
 – 条件文を記述する
  • trueを返すデータが抽出される
  • p.Gender == 1
  • p.Gender == 1 && p.Age > 20


• 抽出順序
 – プロパティを指定する
  • p.Age - 年齢の昇順
  • p.Age descending - 年齢の降順
  • p.Age, p.Name - 同年齢では名前の昇順
LINQ to Object
• Peopleという名前の配列にName、Genger、
  Ageプロパティを持つ匿名オブジェクトを
  持つ

var query = from p in People
           where p.Gender == 1
           orderby p.Age
           select new { p.Name, p.Age };
LINQ to XML
• PeopleというXElement変数にXMLファイルを読み込む
• XMLファイルはPeople/Personという階層構造を持ち、
  PersonノードにはName、Gender、Ageノードが含まれ
  る

var query = from p in People.Descendants("Person")
              where (int)p.Element("Gender") == 1
          orderby (int)p.Element("Age")
              select
                   new {
                      Name = (string)p.Element("Name"),
                      Age = (int)p.Element(“Age”)
                   };
LINQ to SQL
• ウィザードを利用してDataContextクラス、
  Table<TEntity>クラスを作成している

var query = from p in dtc.People
          where p.Gender == 1
          orderby p.Age
          select new { p.Name, p.Age };
LINQの仕組み ー その1
• クエリ式はラムダ式を引数にとる拡張メソッドが
  連結された形式に変換される

var query = from p in People
           where p.Gender == 1
           orderby p.Age
           select new { p.Name, p.Age };


var query = People.Where(p => p.Gender == 1)
                   .OrderBy(p => p.Age)
                   .Select(p => new { p.Name, p.Age });
LINQの仕組み ー その2
• 対象となるデータにより呼び出される拡張メ
  ソッドが異なる

 – System.LINQ.Enumerable.xxx
    • LINQ to Object
        – 配列、LIST<T>がIEnumerableを継承
    • LINQ to XML
        – Xelement.Decentants()がIEnumerableを返す
    • yieldによる実装 → 遅延実行

 – System.LINQ.Queryable.xxx
    • LINQ to SQL
        – System.Data.Linq.Table<Tentity>がIQueryableを継承
    • ラムダ式の右辺を積んで式のツリー(Expression Tree)を
      作成
    • IQuaryProviderによる実装 → 遅延実行
    • 継承して独自のLINQ to XXX といった仕組みを構築可能
LINQの仕組み ー その3
• 遅延実行
  – データが実際に必要となるタイミングまでクエリ条件は積み重
    ねられていく
        • LINQ to SQLでは積み重ねられたクエリでSQL文が生成


 var query0 = from p in dtc.People
         where p.Gender == 1
         select p;

 var query = from p in query0
       where p.Age > 20
       orderby p.Age
       select new { p.Name, p.Age };



 SELECT [t0].[Name], [t0].[Age]
 FROM [dbo].[People] AS [t0]
 WHERE ([t0].[Age] > @p0) AND ([t0].[Gender] = @p1)
 ORDER BY [t0].[Age]
LINQと同等の処理をC# 2.0で
• whereとselectを書き換える
 1. 拡張メソッドの実装
 2. ラムダ式を利用した拡張メソッド呼び出しに
    変換
 3. ラムダ式をdelegateに変換
 4. whereをFindAllに置き換え
 5. selectを拡張メソッドから通常のメソッド呼び
    出しに変換

• LINQ to Objectのみが可能
  – LINQ to XMLやLINQ to SQLは専用のクラスの導
    入により実装されている
LINQ to Objectの使いどころ

• Frameworkに組み込まれたデータを活用す
  る
• ちょっとしたツールを作るのに便利

 – サンプル:ファイル内文字列検索
LINQ to XMLの使いどころ

•   RSSで提供されるデータを利用する
•   Webサービスで提供されるデータを利用する
    • XML特有の操作技術を覚える必要がない
    • XML文書を変形して保存することも可能
       • XDocument、XElementの機能

    • サンプル:天気予報サービスの利用
LINQ to SQLの使いどころ
• データベース操作の標準化
 – 生成されるSQL文はパラメータクエリとなる
 – 追加/更新/削除時には自動的にトランザクショ
   ンとなる
  • 楽観的同時実行制御
    – 全データチェック、timestampチェック等
  • DataContext.SubmitChanges() により実行される
 – 追加/更新/削除時の検証ロジックをまとめて管
   理できる
  • DataContextやエンティティクラスのpartialメソッドを利用
 – 追加/更新/削除はウィザードで作成されるクラ
   ス(DataContext)の機能と考えるべき
LINQによる異種データの結合
• Object、XML、SQLをJOINすることは可能
 – バーチャルラボで確認できる
 – IEnumerableをベースに結合する
   • 逆(IQuaryableベース)は不可
   • データベース連携の部分では全データを取り出
     してから必要なものを抽出
     – LINQ to SQLをIEnumerableベースで処理
   • DB連携時は無理に結合するより、最小限のデー
     タを取得するようクエリを分けたほうがよいか
     も
     – Containsメソッド等を利用して解決できる
ASP.NETでのLINQ
• LinqDataSourceコントロールが追加されてい
  る
 – LINQ to SQLだけでなく各種オブジェクトが利用
   可能
 – 自動で追加/更新/削除が可能
   • ListViewと組み合わせるとノンコーディングでデータ
     管理ツールのできあがり
   • 制限事項:LINQ to SQLを利用し、SELECTを使わない
 – 表示項目を制限したうえでの追加/更新/削除
   はプログラミングによって対応可能
   • ソートやページングの機能はノンコーディングで利
     用可能
LINQな世界とは
• クエリ式がSQL文に似ているため、データ
  ベースとの連携が注目されがちだが、LINQ
  は本来必要なデータを手軽に抽出するため
  の技術である

• データの抽出はどんなプログラムにも存在
  する。どこでどのようにLINQを使っていく
  かを考えるのがLINQな世界のプログラミン
  グ
  • アーキテクチャとの整合性にも配慮
  • 適材適所を見極める
参考情報
• ビデオ
   – MSDN Screencasts
         • http://www.microsoft.com/uk/msdn/screencasts/default.aspx
         • C# 3.0、LINQ to SQL、LINQ to XML、LINQ to Entities 等の情報

• Blog
   – ScottGu Blog 翻訳
         • http://blogs.wankuma.com/chicasharp/
   – Mike Taulty's Blog : LINQ? Single Step this code...
         • http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/10/03/9842.aspx

• 資料
   – C#3.0の概要
         • http://www.microsoft.com/japan/msdn/net/bb308966.aspx
   – LINQ:.NET統合言語クエリ
         • http://www.microsoft.com/japan/msdn/net/bb308959.aspx
   – .NET標準クエリ演算子
         • http://www.microsoft.com/japan/msdn/net/bb394939.aspx
   – LINQ to SQL:リレーショナルデータのための.NET統合言語クエリ
         • http://www.microsoft.com/japan/msdn/net/bb425822.aspx
   – XMLデータ用の.NET統合言語クエリ
         • http://www.microsoft.com/japan/msdn/net/bb308960.aspx

More Related Content

Viewers also liked

LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
超Linq入門 実践編
超Linq入門 実践編超Linq入門 実践編
超Linq入門 実践編yone64
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsFumitaka Yamada
 
非.NETerに向けたLINQの紹介
非.NETerに向けたLINQの紹介非.NETerに向けたLINQの紹介
非.NETerに向けたLINQの紹介宏章 大橋
 
Final LINQ Extensions II
Final LINQ Extensions IIFinal LINQ Extensions II
Final LINQ Extensions IIKouji Matsui
 

Viewers also liked (6)

LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
超Linq入門 実践編
超Linq入門 実践編超Linq入門 実践編
超Linq入門 実践編
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 
非.NETerに向けたLINQの紹介
非.NETerに向けたLINQの紹介非.NETerに向けたLINQの紹介
非.NETerに向けたLINQの紹介
 
LINQ基本のキ
LINQ基本のキLINQ基本のキ
LINQ基本のキ
 
Final LINQ Extensions II
Final LINQ Extensions IIFinal LINQ Extensions II
Final LINQ Extensions II
 

Similar to 20080201

LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringEiji Shinohara
 
第2章アーキテクチャ
第2章アーキテクチャ第2章アーキテクチャ
第2章アーキテクチャKenta Hattori
 
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューション
Data-driven Design: 4つの技法InfoPathを用いたスケーラブルSharePointソリューションData-driven Design: 4つの技法InfoPathを用いたスケーラブルSharePointソリューション
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューションJamesLRishe
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会Satoshi Nagayasu
 
Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Yuki Ogasawara
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Taro L. Saito
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Shinichi Tomita
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905Nobuaki Oshiro
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Visual Studio 2008による 開発環境・プログラミングの進化
Visual Studio 2008による 開発環境・プログラミングの進化Visual Studio 2008による 開発環境・プログラミングの進化
Visual Studio 2008による 開発環境・プログラミングの進化Fujio Kojima
 
10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010Nobuaki Oshiro
 
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーションYoshifumi Kawai
 
Css2014 ruo ando_2014-10-23-01
Css2014 ruo ando_2014-10-23-01Css2014 ruo ando_2014-10-23-01
Css2014 ruo ando_2014-10-23-01Ruo Ando
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ朋哉 池田
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Shotaro Suzuki
 

Similar to 20080201 (20)

LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 Spring
 
第2章アーキテクチャ
第2章アーキテクチャ第2章アーキテクチャ
第2章アーキテクチャ
 
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューション
Data-driven Design: 4つの技法InfoPathを用いたスケーラブルSharePointソリューションData-driven Design: 4つの技法InfoPathを用いたスケーラブルSharePointソリューション
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューション
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512
 
Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例Presto As A Service - Treasure DataでのPresto運用事例
Presto As A Service - Treasure DataでのPresto運用事例
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
LDA入門
LDA入門LDA入門
LDA入門
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
10分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 090510分で分かるr言語入門ver2.14 15 0905
10分で分かるr言語入門ver2.14 15 0905
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Visual Studio 2008による 開発環境・プログラミングの進化
Visual Studio 2008による 開発環境・プログラミングの進化Visual Studio 2008による 開発環境・プログラミングの進化
Visual Studio 2008による 開発環境・プログラミングの進化
 
10分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 101010分で分かるr言語入門ver2.15 15 1010
10分で分かるr言語入門ver2.15 15 1010
 
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
 
Css2014 ruo ando_2014-10-23-01
Css2014 ruo ando_2014-10-23-01Css2014 ruo ando_2014-10-23-01
Css2014 ruo ando_2014-10-23-01
 
LINQ to なにがし
LINQ to なにがしLINQ to なにがし
LINQ to なにがし
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
 
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
Building asp.net core blazor and elasticsearch elasticsearch using visual stu...
 

More from 小野 修司 (20)

20140322
2014032220140322
20140322
 
20121215
2012121520121215
20121215
 
20120616
2012061620120616
20120616
 
20120609
2012060920120609
20120609
 
20120425
2012042520120425
20120425
 
20120128
2012012820120128
20120128
 
20111203
2011120320111203
20111203
 
20110607
2011060720110607
20110607
 
20100313
2010031320100313
20100313
 
20100224
2010022420100224
20100224
 
20100218 lt
20100218 lt20100218 lt
20100218 lt
 
20100218
2010021820100218
20100218
 
20091207
2009120720091207
20091207
 
20090711
2009071120090711
20090711
 
20090606
2009060620090606
20090606
 
20090418
2009041820090418
20090418
 
20090328
2009032820090328
20090328
 
20090212
2009021220090212
20090212
 
20081003
2008100320081003
20081003
 
20080630
2008063020080630
20080630
 

20080201

  • 2. LINQとは • データ(オブジェクト)の集合から簡単な記述で 『必要なオブジェクト』の『必要なメンバ』のみを 『必要とする順序』で取り出せるようにしたシン タックスシュガー – 開発者は抽出条件、抽出するメンバ、抽出順序にのみ 関心を払う – 取り出すデータの型を用意したり、繰り返し文を書い たりしない • 定型的作業のタイピングの大幅な削減 ・クエリ式のサンプル: var query = from データ変数 in データの集合 where 抽出条件 orderby 抽出順序のキー項目 select 抽出するメンバ で構成される新しいクラス;
  • 3. 対象となるデータ • 配列、LIST<T>(LINQ to Object) – 独自に定義したオブジェクトや組み込みオブジェクトの 集合 • XMLファイル(LINQ to XML) – XDocument、XElement内のオブジェクトのツリー • データベース(LINQ to SQL) – DataContext経由で取り出すTable<TEntity>オブジェクト • 対応するのはSQL Serverのみ • Entity Data Model(LINQ to Entities) – Entity Frameworkによって生成されるオブジェクト • Entity Frameworkは.NET Framework 3.5のリリースには含まれて いない
  • 4. クエリ式の仕様 • from句からはじまる • from、let、where、join、orderbyを内部に 記述 • select句またはgroup句で終わる • add/update/deleteは仕様として存在しない – データを抽出することが目的
  • 5. SQL文との違い • 抽出条件 – 条件文を記述する • trueを返すデータが抽出される • p.Gender == 1 • p.Gender == 1 && p.Age > 20 • 抽出順序 – プロパティを指定する • p.Age - 年齢の昇順 • p.Age descending - 年齢の降順 • p.Age, p.Name - 同年齢では名前の昇順
  • 6. LINQ to Object • Peopleという名前の配列にName、Genger、 Ageプロパティを持つ匿名オブジェクトを 持つ var query = from p in People where p.Gender == 1 orderby p.Age select new { p.Name, p.Age };
  • 7. LINQ to XML • PeopleというXElement変数にXMLファイルを読み込む • XMLファイルはPeople/Personという階層構造を持ち、 PersonノードにはName、Gender、Ageノードが含まれ る var query = from p in People.Descendants("Person") where (int)p.Element("Gender") == 1 orderby (int)p.Element("Age") select new { Name = (string)p.Element("Name"), Age = (int)p.Element(“Age”) };
  • 8. LINQ to SQL • ウィザードを利用してDataContextクラス、 Table<TEntity>クラスを作成している var query = from p in dtc.People where p.Gender == 1 orderby p.Age select new { p.Name, p.Age };
  • 9. LINQの仕組み ー その1 • クエリ式はラムダ式を引数にとる拡張メソッドが 連結された形式に変換される var query = from p in People where p.Gender == 1 orderby p.Age select new { p.Name, p.Age }; var query = People.Where(p => p.Gender == 1) .OrderBy(p => p.Age) .Select(p => new { p.Name, p.Age });
  • 10. LINQの仕組み ー その2 • 対象となるデータにより呼び出される拡張メ ソッドが異なる – System.LINQ.Enumerable.xxx • LINQ to Object – 配列、LIST<T>がIEnumerableを継承 • LINQ to XML – Xelement.Decentants()がIEnumerableを返す • yieldによる実装 → 遅延実行 – System.LINQ.Queryable.xxx • LINQ to SQL – System.Data.Linq.Table<Tentity>がIQueryableを継承 • ラムダ式の右辺を積んで式のツリー(Expression Tree)を 作成 • IQuaryProviderによる実装 → 遅延実行 • 継承して独自のLINQ to XXX といった仕組みを構築可能
  • 11. LINQの仕組み ー その3 • 遅延実行 – データが実際に必要となるタイミングまでクエリ条件は積み重 ねられていく • LINQ to SQLでは積み重ねられたクエリでSQL文が生成 var query0 = from p in dtc.People where p.Gender == 1 select p; var query = from p in query0 where p.Age > 20 orderby p.Age select new { p.Name, p.Age }; SELECT [t0].[Name], [t0].[Age] FROM [dbo].[People] AS [t0] WHERE ([t0].[Age] > @p0) AND ([t0].[Gender] = @p1) ORDER BY [t0].[Age]
  • 12. LINQと同等の処理をC# 2.0で • whereとselectを書き換える 1. 拡張メソッドの実装 2. ラムダ式を利用した拡張メソッド呼び出しに 変換 3. ラムダ式をdelegateに変換 4. whereをFindAllに置き換え 5. selectを拡張メソッドから通常のメソッド呼び 出しに変換 • LINQ to Objectのみが可能 – LINQ to XMLやLINQ to SQLは専用のクラスの導 入により実装されている
  • 13. LINQ to Objectの使いどころ • Frameworkに組み込まれたデータを活用す る • ちょっとしたツールを作るのに便利 – サンプル:ファイル内文字列検索
  • 14. LINQ to XMLの使いどころ • RSSで提供されるデータを利用する • Webサービスで提供されるデータを利用する • XML特有の操作技術を覚える必要がない • XML文書を変形して保存することも可能 • XDocument、XElementの機能 • サンプル:天気予報サービスの利用
  • 15. LINQ to SQLの使いどころ • データベース操作の標準化 – 生成されるSQL文はパラメータクエリとなる – 追加/更新/削除時には自動的にトランザクショ ンとなる • 楽観的同時実行制御 – 全データチェック、timestampチェック等 • DataContext.SubmitChanges() により実行される – 追加/更新/削除時の検証ロジックをまとめて管 理できる • DataContextやエンティティクラスのpartialメソッドを利用 – 追加/更新/削除はウィザードで作成されるクラ ス(DataContext)の機能と考えるべき
  • 16. LINQによる異種データの結合 • Object、XML、SQLをJOINすることは可能 – バーチャルラボで確認できる – IEnumerableをベースに結合する • 逆(IQuaryableベース)は不可 • データベース連携の部分では全データを取り出 してから必要なものを抽出 – LINQ to SQLをIEnumerableベースで処理 • DB連携時は無理に結合するより、最小限のデー タを取得するようクエリを分けたほうがよいか も – Containsメソッド等を利用して解決できる
  • 17. ASP.NETでのLINQ • LinqDataSourceコントロールが追加されてい る – LINQ to SQLだけでなく各種オブジェクトが利用 可能 – 自動で追加/更新/削除が可能 • ListViewと組み合わせるとノンコーディングでデータ 管理ツールのできあがり • 制限事項:LINQ to SQLを利用し、SELECTを使わない – 表示項目を制限したうえでの追加/更新/削除 はプログラミングによって対応可能 • ソートやページングの機能はノンコーディングで利 用可能
  • 18. LINQな世界とは • クエリ式がSQL文に似ているため、データ ベースとの連携が注目されがちだが、LINQ は本来必要なデータを手軽に抽出するため の技術である • データの抽出はどんなプログラムにも存在 する。どこでどのようにLINQを使っていく かを考えるのがLINQな世界のプログラミン グ • アーキテクチャとの整合性にも配慮 • 適材適所を見極める
  • 19. 参考情報 • ビデオ – MSDN Screencasts • http://www.microsoft.com/uk/msdn/screencasts/default.aspx • C# 3.0、LINQ to SQL、LINQ to XML、LINQ to Entities 等の情報 • Blog – ScottGu Blog 翻訳 • http://blogs.wankuma.com/chicasharp/ – Mike Taulty's Blog : LINQ? Single Step this code... • http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/10/03/9842.aspx • 資料 – C#3.0の概要 • http://www.microsoft.com/japan/msdn/net/bb308966.aspx – LINQ:.NET統合言語クエリ • http://www.microsoft.com/japan/msdn/net/bb308959.aspx – .NET標準クエリ演算子 • http://www.microsoft.com/japan/msdn/net/bb394939.aspx – LINQ to SQL:リレーショナルデータのための.NET統合言語クエリ • http://www.microsoft.com/japan/msdn/net/bb425822.aspx – XMLデータ用の.NET統合言語クエリ • http://www.microsoft.com/japan/msdn/net/bb308960.aspx