20080201

451 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
451
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20080201

  1. 1. LINQな世界への招待 どっとねっとふぁん http://dotnetfan.org/ 小野 修司
  2. 2. LINQとは• データ(オブジェクト)の集合から簡単な記述で 『必要なオブジェクト』の『必要なメンバ』のみを 『必要とする順序』で取り出せるようにしたシン タックスシュガー – 開発者は抽出条件、抽出するメンバ、抽出順序にのみ 関心を払う – 取り出すデータの型を用意したり、繰り返し文を書い たりしない • 定型的作業のタイピングの大幅な削減・クエリ式のサンプル:var query = from データ変数 in データの集合 where 抽出条件 orderby 抽出順序のキー項目 select 抽出するメンバ で構成される新しいクラス;
  3. 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. 4. クエリ式の仕様• from句からはじまる• from、let、where、join、orderbyを内部に 記述• select句またはgroup句で終わる• add/update/deleteは仕様として存在しない – データを抽出することが目的
  5. 5. SQL文との違い• 抽出条件 – 条件文を記述する • trueを返すデータが抽出される • p.Gender == 1 • p.Gender == 1 && p.Age > 20• 抽出順序 – プロパティを指定する • p.Age - 年齢の昇順 • p.Age descending - 年齢の降順 • p.Age, p.Name - 同年齢では名前の昇順
  6. 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. 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. 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. 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. 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. 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. 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. 13. LINQ to Objectの使いどころ• Frameworkに組み込まれたデータを活用す る• ちょっとしたツールを作るのに便利 – サンプル:ファイル内文字列検索
  14. 14. LINQ to XMLの使いどころ• RSSで提供されるデータを利用する• Webサービスで提供されるデータを利用する • XML特有の操作技術を覚える必要がない • XML文書を変形して保存することも可能 • XDocument、XElementの機能 • サンプル:天気予報サービスの利用
  15. 15. LINQ to SQLの使いどころ• データベース操作の標準化 – 生成されるSQL文はパラメータクエリとなる – 追加/更新/削除時には自動的にトランザクショ ンとなる • 楽観的同時実行制御 – 全データチェック、timestampチェック等 • DataContext.SubmitChanges() により実行される – 追加/更新/削除時の検証ロジックをまとめて管 理できる • DataContextやエンティティクラスのpartialメソッドを利用 – 追加/更新/削除はウィザードで作成されるクラ ス(DataContext)の機能と考えるべき
  16. 16. LINQによる異種データの結合• Object、XML、SQLをJOINすることは可能 – バーチャルラボで確認できる – IEnumerableをベースに結合する • 逆(IQuaryableベース)は不可 • データベース連携の部分では全データを取り出 してから必要なものを抽出 – LINQ to SQLをIEnumerableベースで処理 • DB連携時は無理に結合するより、最小限のデー タを取得するようクエリを分けたほうがよいか も – Containsメソッド等を利用して解決できる
  17. 17. ASP.NETでのLINQ• LinqDataSourceコントロールが追加されてい る – LINQ to SQLだけでなく各種オブジェクトが利用 可能 – 自動で追加/更新/削除が可能 • ListViewと組み合わせるとノンコーディングでデータ 管理ツールのできあがり • 制限事項:LINQ to SQLを利用し、SELECTを使わない – 表示項目を制限したうえでの追加/更新/削除 はプログラミングによって対応可能 • ソートやページングの機能はノンコーディングで利 用可能
  18. 18. LINQな世界とは• クエリ式がSQL文に似ているため、データ ベースとの連携が注目されがちだが、LINQ は本来必要なデータを手軽に抽出するため の技術である• データの抽出はどんなプログラムにも存在 する。どこでどのようにLINQを使っていく かを考えるのがLINQな世界のプログラミン グ • アーキテクチャとの整合性にも配慮 • 適材適所を見極める
  19. 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 Taultys 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

×