Your SlideShare is downloading. ×
0
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
20071204
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

20071204

287

Published on

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

  • Be the first to like this

No Downloads
Views
Total Views
287
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. LINQな世界への招待 Webアプリケーションボードリー ダ 小野修司(どっとねっとふぁん) VSUG DAY 2007.12.8
  • 2. LINQとは• データ(オブジェクト)の集合から簡単な記述 で『必要なオブジェクト』の『必要なメンバ』 のみを『必要とする順序』で取り出せるように したシンタックスシュガー – 開発者は抽出条件、抽出するメンバ、抽出順序にの み関心を払う – 取り出すデータの型を用意したり、繰り返し文を書 いたりしない • 定型的作業のタイピングの大幅な削減・クエリ式のサンプル:var query = from データ変数 in データの集合 where 抽出条件 orderby 抽出順序のキー項目 select 抽出するメンバ で構成される新しいクラス VSUG DAY 2007.12.8
  • 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のリリースには含 まれていない VSUG DAY 2007.12.8
  • 4. 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 }; VSUG DAY 2007.12.8
  • 5. 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”) }; VSUG DAY 2007.12.8
  • 6. 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 }; VSUG DAY 2007.12.8
  • 7. 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 }); VSUG DAY 2007.12.8
  • 8. 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 といった仕組みを構築可能 VSUG DAY 2007.12.8
  • 9. 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] VSUG DAY 2007.12.8
  • 10. LINQ to Objectの使いどころ• Frameworkに組み込まれたデータを活用する – サンプル:ファイル内文字列検索LINQ to XMLの使いどころ• RSSで提供されるデータを利用する• Webサービスで提供されるデータを利用する – XML特有の操作技術を覚える必要がない – XML文書の変形に利用することも可能 – サンプル:天気予報サービスの利用 VSUG DAY 2007.12.8
  • 11. LINQ to SQLの使いどころ• データベース操作の標準化 – 生成されるSQL文はパラメータクエリとなる – 追加/更新/削除時には自動的にトランザクショ ンとなる • 楽観的同時実行制御 – 全データチェック、timestampチェック等 • DataContext.SubmitChanges() により実行される – 追加/更新/削除時の検証ロジックをまとめて管 理できる • DataContextやエンティティクラスのpartialメソッドを 利用 – 追加/更新/削除はウィザードで作成されるクラ スの機能と考えるべき VSUG DAY 2007.12.8
  • 12. LINQによる異種データの結合• Object、XML、SQLをJOINすることは可 能 – バーチャルラボで確認できる – IEnumerableをベースに結合する • 逆(IQuaryableベース)は不可 • データベース連携の部分では全データを取り出し てから必要なものを抽出 – LINQ to SQLをIEnumerableベースで処理 • DB連携時は無理に結合するより、最小限のデータ を取得するようクエリを分けたほうがよいかも – Containsメソッド等を利用して解決できる VSUG DAY 2007.12.8
  • 13. ASP.NETでのLINQ• LinqDataSourceコントロールが追加 – LINQ to SQLだけでなく各種オブジェクトが利用 可能 – 自動で追加/更新/削除が可能 • ListViewと組み合わせるとノンコーディングでデータ 管理ツールのできあがり • 制限事項:LINQ to SQLを利用し、SELECTを使わない – 表示項目を制限したうえでの追加/更新/削除は プログラミングによって対応可能 • ソートやページングの機能はノンコーディングで利用 可能 • Extensionメソッドを利用した検証機能も利用可能 • 同時実行制御は自分でプログラミング VSUG DAY 2007.12.8
  • 14. LINQな世界とは• クエリ式がSQL文に似ているため、デー タベースとの連携が注目されがちだが、 LINQは本来必要なデータを手軽に抽出す るための技術である• データの抽出はどんなプログラムにも存 在する。そこにどのようにLINQを使って いくかを考えるのがLINQな世界のプログ ラミング VSUG DAY 2007.12.8
  • 15. 参考情報• ビデオ – MSDN Nuggets • http://www.microsoft.com/uk/msdn/nuggets/ • C# 3.0:8本 LINQ to SQL:18本 LINQ to XML:6本 LINQ to Entities:5本 等• 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 VSUG DAY 2007.12.8

×