SlideShare a Scribd company logo
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

PPTX
20071204
PPTX
LINQ概要
PPTX
LINQ の概要とかもろもろ
PDF
Datalogからsqlへの トランスレータを書いた話
PDF
GeneratingWikipedia_ICLR18_論文紹介
PPTX
サーバレスBIデモ
PDF
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
PDF
Next-L Enju 開発ワークショップ #35
20071204
LINQ概要
LINQ の概要とかもろもろ
Datalogからsqlへの トランスレータを書いた話
GeneratingWikipedia_ICLR18_論文紹介
サーバレスBIデモ
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
Next-L Enju 開発ワークショップ #35

Viewers also liked (6)

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

Similar to 20080201 (20)

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

More from 小野 修司 (20)

PPTX
20140322
PPTX
20121215
PPTX
20120616
PPTX
20120609
PPTX
20120425
PPTX
20120128
PPTX
20111203
PPTX
20110607
PPTX
20100313
PPT
20100224
PPTX
20100218 lt
PPTX
20100218
PPTX
20091207
PPTX
20090711
PPT
20090606
PPTX
20090418
PPT
20090328
PPT
20090212
PPTX
20081003
PPTX
20080630
20140322
20121215
20120616
20120609
20120425
20120128
20111203
20110607
20100313
20100224
20100218 lt
20100218
20091207
20090711
20090606
20090418
20090328
20090212
20081003
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