【VB.NET】LINQ友の会【C#, C♯, C#】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2008/02/09(土) 23:51:34
VisualStudio2008より追加された便利で強力な機能

  統合言語クエリ (LINQ : Language Integrated Query)

ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
2008/05/24(土) 21:01:08
>>159
LINQ の価値は速度じゃなくて、
OOP パラダイムと RDB パラダイムの懸け橋になること。
SQL でおなかいっぱいって人にこそ LINQ がいいんじゃないか。
2008/05/24(土) 23:11:23
パラ?
お母さんが子供に教えるように教えてください
2008/05/24(土) 23:23:16
>>161
C# の中で、オブジェクト指向言語の感覚からあまり外れることなく、
データベース問い合わせが書けるってことが大事。
2008/05/25(日) 00:22:26
最初は書き方に戸惑うが、だいたいの書き方がわかってくればインテリセンス使えるのがとても大きい
2008/05/25(日) 04:39:07
コンパイラによる構文チェックが行われるというのも大きい。
条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて
バグを作り込んでしまうような、つまらないミスを防げる。
DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に
つながる要素がいろいろあるよ。
俺もほとんど把握してないけどさ。
2008/05/25(日) 09:04:21
SQLって、汎用コレクションデータ処理エンジンだね。
C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、
コードを作りこまなくちゃいけないけど。
RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。
例えるなら文字列の正規表現みたいな感じで。

それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして
からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう
ってのは便利。
2008/05/25(日) 09:41:44
>>161
インピーダンスミスマッチでぐぐれ
2008/05/25(日) 11:12:57
SQLMetalってすでにあるテーブルのオブジェクト定義のXMLを生成するものだよね?
逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?
2008/05/25(日) 14:02:32
>>167
方法 : データベースを動的に作成する (LINQ to SQL)
http://msdn.microsoft.com/ja-jp/library/bb399420.aspx
2008/05/25(日) 14:39:10
>>161
これでも読め
http://www.microsoft.com/japan/msdn/net/bb425822.aspx
170デフォルトの名無しさん
垢版 |
2008/06/02(月) 22:49:47
Linq人気ないから救済でAgeてやる
感謝しろビル
2008/06/04(水) 08:38:01
PL/SQLですね。
2008/06/09(月) 11:06:00
http://pc11.2ch.net/test/read.cgi/tech/1212972014/
173デフォルトの名無しさん
垢版 |
2008/06/15(日) 19:33:30
えーい
Linqも人気ないけど
ダメ技術のかほりがすっぞ
2008/06/17(火) 02:07:55
使ったからといって、別に何かが楽になったりすっきりしたりするように見えないんだよな。
2008/06/17(火) 07:25:18
ちょっとしたDBアプリ作るの楽になるが。
XMLとかにもいいと思うよ。
2008/06/17(火) 21:00:53
メソッド形式は手軽に使えてすごく便利だよね
クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない
2008/06/17(火) 22:19:07
未だにクエリ式だとpとかqとかのスコープがよくわかってない俺。
2008/06/18(水) 03:55:30
fromやletが沢山必要になる場合は
クエリ式を使ってる

けど、それ以外ではクエリ式は全然使ってない
2008/06/19(木) 22:35:19
使い方も確立されてない未知のもんだからな。
ポテンシャルは高い気がする。
2008/06/20(金) 00:55:26
LINQきれいにかけるけれど、特にObjectLINQだと効率的にはだめな場合もあるからなぁ。
微妙なところだ。
PLINQとかになるとまた話は違うだろうけれど。
2008/06/20(金) 08:43:29
>>180
from x in a select x; みたいなのを foreach(var x in a) yield return x; に変えるような
最適化だとせいぜい5%くらいしかスピード変わらない。
5%を気にしないといけない場面はそれほど多くないと思う。

ただ、a.Max(), a.Min(), a.Count() を同時に求めたいような場合、
自前で for まわして同時に求めた方が圧倒的に早い。

Parallel Extensions にはParallel.Forとかもついてるしなぁ。
PLINQでもやっぱり Max, Min, Count の問題は解消しない。
2008/06/20(金) 09:05:06
>>181
DryadLINQみたいにExpressionを直接扱う計算エンジンが要るね。
PLINQは所詮IEnumerableベースだし。
ttp://research.microsoft.com/research/sv/DryadLINQ/

ポテンシャルはDryadLINQ>>>>>PLINQなんだろうけど、
出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。

C# 3.0もお披露目から1年半ぐらいかかったし。
出荷までの時間短縮はお金じゃ解決しづらいんだろうな。
2008/06/20(金) 09:07:06
>出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。

不等号逆だった……
ポテンシャル: DryadLINQ>>>>>PLINQ
出荷までにかかる時間: PLINQ<<<DryadLINQ
2008/06/20(金) 09:10:04
>C# 3.0もお披露目から1年半ぐらいかかったし。

あとこれもお披露目から2年半の間違い。
2008/06/21(土) 10:41:48
もうちょっと落ち着いて!
2008/06/26(木) 01:03:41
いや、勢いあったほうがよい
2008/07/07(月) 22:42:17
複雑なXMLファイルの読み込みはXmlTextReaderよりLINQ to Xmlを使ったほうが簡潔に書けそうですか?
2008/07/07(月) 22:53:07
書いてみろ
2008/07/07(月) 23:23:38
>>188
一言レスって周りにも意図伝わらないからヤメレ
2008/07/07(月) 23:26:55
最近、勉強ついでにLINQtoSQL使ってるけどクラスとして扱えるだけで便利すぎ。
リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。
長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。
2008/07/07(月) 23:30:39
>>189
自分で書けばわかるって事だろ?

意図理解できないのは君だけだと思うが。
2008/07/08(火) 10:10:04
XmlElementとXElementの違いを問うならわかるが、
XmlReaderと比べるあたり自分では何も調べずに
思いつきで書き込んだと証明してるようなものだ。
2008/07/08(火) 23:25:23
>>191
二つコードを書けということですね、わかります

2008/07/08(火) 23:47:33
なんか俺のせいで荒れてるみたいだな
ごめんなさい

>>192
違いの話なんかしてないっすよ?




あれからbuilderってサイトのサンプルを読んで勉強してみてる。
ちょっと興奮で震えてます。
皆ありがとう
2008/07/09(水) 03:40:44
複雑なXMLファイルの定義によるかな。
Linq for XMLで使うXElement系のクラスはDTDやXMLスキーマをサポートしない。
構造の検査、実体やデフォルトの属性を展開することが必要という意味で複雑なXMLだったら手も足も出ない。
XDocument/XElementはXMLパーサーとしての機能をしぼっている。
簡単なXMLの読み書き加工は簡単にかつスマートに書ける、Linq for XMLはその為のもの。

XmlDocment/ElementはDOMとしてのすべての機能をもつ。多機能ではあるが何をするにも大掛かり。

XmlReader/Writerは StAX型の前方参照型で高速。
使用メモリが少なくてすみ全部メモリに読み込むのが問題になるような大きなXMLも対応できる。
扱いは当然ややこしい。



2008/07/11(金) 13:29:59
意外に使いやすいよねXmlReader/Writer
2008/07/19(土) 20:38:17
マイクロソフト公式解説書としてLINQ本が出るってよ

LINQテクノロジ入門
http://ec.nikkeibp.co.jp/item/books/A04100.html
・07/22発売 3,360円(税込み) B5変 280P
198197
垢版 |
2008/07/27(日) 00:32:31
届いたんでぼちぼち読み始め

図表を多く使っていて、C#/VBのサンプルコードも多いのは○
内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。

・C#/VB・SQLに関する基本的な理解は必須。
・開発経験のない初心者が読むには少し難しい。
・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。
2008/07/27(日) 01:55:18
LINQのProviderでしたっけ?クエリーとかを実装する側の作業についてまとまってるarticleとかってありますかね?(´・ω・`)
2008/07/27(日) 11:06:25
>>199
単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。
LINQ to SQL みたいなことしたければ、
LINQ の勉強というよりは、Expression Trees の勉強が必要。

で、LINQ がらみの記事は結構おおいけど、
Expression Trees はあんまり見ないなぁ。
2008/07/27(日) 12:23:14
>>200
それです、それ。
具体的にどこまでのExpressionTreeをどんな風に実装したらいいのかが・・・

2008/07/27(日) 12:55:38
Expression Trees の方は、↓に多少サンプルあり。
http://ufcpp.net/study/csharp/sp3_linqreconstruct.html

LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。
2008/07/27(日) 13:14:37
MSDNのこれも読んでおくといいかも。
ttp://msdn.microsoft.com/ja-jp/library/bb546158.aspx
ttp://msdn.microsoft.com/ja-jp/library/bb882640.aspx
2008/08/31(日) 11:34:15
>>198
LINQの本が少ない中、この本はお薦め。
LINQを構成する基礎や、現在のバージョンで、できる事できない事、
やってはダメな事が書かれている。
.netとSQLを使って仕事している人ならLINQがどういう物か理解できる。
少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。
2008/08/31(日) 18:22:46
LINQは、VSに付いてくるC#のサンプルコードだけで十分理解できるでしょ。
2008/08/31(日) 23:44:43
LINQがこれから他のテクノロジとどう統合されてくのかよくわからん(´・ω・`)
2008/09/01(月) 00:10:28
> どう統合されてくのか

消えていくと言う運命もあるから、俺はもう少し様子見。
2008/09/01(月) 00:59:30
これだけ言語に食いこんだものが消えるというのはありえないと思うが。
2008/09/01(月) 06:48:16
いや、互換性のために機能としてはずっと残るかもしれないけど
新規には誰も使わなくなって結局放置と言うこと。

まあ、特攻する人も必要だから、>>208 は頑張ってくれ。
2008/09/01(月) 09:00:39
小手先の道具として便利なLINQ to objectsくらいは残るでしょ
そのほかはともかく
2008/09/01(月) 21:35:34
別に「残らない」なんて断定してるわけじゃないよ。
俺はなくてもあまり困ってないし、「残らない可能性もある」ので
ちょっと様子見してるだげ。

いいと思う人はどしどし使って広めてくれ。
2008/09/01(月) 23:25:27
LINQ便利ざんすよ?
特にLINQtoSQL。XMLはしらんがたぶん便利だろう。
今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。
2008/09/01(月) 23:38:08
LINQ の意義の1つに、コレクションに対する操作がらみのメソッド名を統一したってのがあるから、
今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、
コレクションとかサーバ問い合わせ系のライブラリ書く人は
おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。

そういう意味では、廃れないと思うんだが。
クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、
命名規約の部分に関しては絶対残る。
2008/09/01(月) 23:43:37
MS の技術が「なくても困らない」と感じるのは、
MS がエンタープライズ相手の商売してるから、
個人で趣味で開発してる人へのアピール弱いせい。
あんまりホビープログラムでDBアプリとか書かないし。
2008/09/02(火) 00:10:13
LINQはEntity Frameworkなんかと密接に関わるからねー
まだまだこれからの技術。
2008/09/03(水) 00:23:39
group by ... into g select new {value1 => g.hoge, value2 => g.fuga }
みたいなLINQ書くとselect newの部分でvalue1とvalue2を生成するためにSQLサブクエリが生成されるんだけど、
これってgroup byだけで上手く書き直す方法ないんかなぁ。

というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。
2008/09/03(水) 08:19:42
LINQ to SQL 自体、Entity Framework までの繋ぎの過渡技術だし、
今後 Entity Fx の側がよっぽど大ごけしないと
LINQ to SQL のグレードアップは見込めない気もする。

LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。
2008/09/03(水) 08:25:31
EntityFWのクエリーインターフェースとして、LINQ使われるんじゃないの?(´・ω・`)
今のLINQのEntityうんたらがもっとしっかりしたものになるということ?
2008/09/03(水) 08:44:14
裏側の最適化の話ね。

同じ LINQ クエリ式を書いたときに、
実際にどういう SQL 文が発行されるかという、
実装上の最適化の部分に関して、
LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。

まだ手をつけてる人が少なくて情報少ないけども、
将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。
2008/09/03(水) 08:46:06
LINQtoSQLがせいじゅくされてLINQtoEntityになるのかとおもっとった
2008/09/11(木) 20:45:39
りんきゅー><
2008/09/17(水) 20:13:37
↓をメソッド形式で書きたいのですが、OrderByメソッドで複数のプロパティで
ソートするのははどうすればいいですか?

var v = from e in GetFoo() orderby e.Age, e.Name select e

OrderBy二回せずに一回でさくっと書きたいです。
2008/09/17(水) 22:32:24
>>222
OrderBy(1つ目の条件).ThenBy(2つ目の条件)

OrderBy 1回というのは無理。
2008/09/18(木) 20:14:01
>>223
ThenByって知らなかった。ありがと。
2008/09/19(金) 01:50:55
つか、そんなの条件式を二つ持つOrderByを自分で実装するがよろし
2008/09/19(金) 03:17:06
引数可変にしてOrderBy〜ThenByに丸投げで、1分とかからずに実装できるな
227デフォルトの名無しさん
垢版 |
2008/09/19(金) 07:24:56
こうして車輪は四角に変容しバグを抱擁した後に再輸出されるのであった...
228デフォルトの名無しさん
垢版 |
2008/09/28(日) 23:54:29
LINQの遅延実行と即時実行は正直いらない気がする。
Aggreegate戻り値はIntegerだし、クエリ機能あれば十分なのでは。

LINQ TO XMLとか開発の現場でまず使うのは小数だろうし、可用性が低いよ。
VBチームの自己満足だね。いつものことだけど。
2008/09/29(月) 12:49:16
>>228
VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。
Integerってどういう意味だろう、集計対象の型で集計されると思うけど。

VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて
収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。
2008/09/29(月) 14:30:31
VBはラムダ式が冗長だから拡張メソッドでクエリ書くと悲惨なことになる
2008/09/29(月) 14:54:49
遅延実行と即時評価ってやたら強調されてるけど
やっぱりC#のyield知らないとわかりにくいのかな
2008/09/29(月) 23:02:22
言われてみるとyieldを知らない(あまり使った事がない)とすれば
即時実行でないのに違和感を感じるのも分かるな。
233デフォルトの名無しさん
垢版 |
2008/09/30(火) 11:58:27
いまさらだけど、yield Returnつう名前がややこすいよ!!
2008/09/30(火) 23:43:43
yield とかってどこからきたん?関数型?
2008/09/30(火) 23:47:50
Rubyのはクロージャ呼び出しだからPythonかなぁ。
Windows2x時代のAPIは関係ないと思う。
236デフォルトの名無しさん
垢版 |
2008/10/01(水) 02:17:48
ICONからきていると予想
Fiberはいつのまにか消えていたってオチかな
237[Fn]+[名無しさん]
垢版 |
2008/10/02(木) 00:00:54
てかDTDとかXMLスキーマサポートしてない段階でLINQ廃レは確定ぽ。。
2008/10/02(木) 00:06:53
それは LINQ to XML の問題であって、LINQ の問題じゃないのでは。
2008/10/02(木) 01:54:39
LINQ to XMLはもともとXmlDOMやXmlReaderの代替を狙ったものじゃなく、
standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。
はじめからDTDやXMLSchemaはサポートしないことになっていた。
もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。
いっそなくすか、もっと充実させるかどちらかで。
2008/10/02(木) 08:21:03
スキーマはサポートしない、って確かにそうなんだけど
ぶっちゃけあれ下層に XmlReader が使えるからでは
ないのかと
241デフォルトの名無しさん
垢版 |
2008/10/02(木) 13:10:43
LINQはすんばらしい
FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。
2008/10/03(金) 00:46:47
C#だとエディットコンティニューが使えないのは結構痛い
2008/10/03(金) 10:10:47
エディットコンティニュかあ、x64だと使えないんだよなあ。
まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。
244デフォルトの名無しさん
垢版 |
2008/10/11(土) 23:59:11
てかLINQってORACLEとかポスグレでも使えるのね。
2008/10/12(日) 00:58:14
>>244
LINQ to Entity の出た今となってはね。
MS SQL Server でしか使えないって言われてたのは、
SP1 入る前、LINQ to SQL の時代の話。
2008/10/12(日) 02:57:11
別に Linq to SQL でも別データベースサポート可能だよ。
でも Linq -> Entity SQL がサポートされたから、Entity SQL ->
ネイティブ SQL だけでいいじゃん=皆やる気ナスなだけで。
247デフォルトの名無しさん
垢版 |
2008/10/12(日) 20:47:40
Linq to Entityが生成する生のSQLを確認する方法を教えてください。
2008/10/13(月) 00:46:17
それは実行される前に?恒常的に?
そうじゃないならログ見りゃいいと思うけど・・・
2008/10/13(月) 17:15:00
>>248
実行時でかまいません。
Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。
またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。
探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。
2008/10/13(月) 21:39:14
だから SQL Server なら確かプロファイラ起動してトレースの開始で…
と記憶を頼りにぐぐって気づいたんだが Express にはないのか
このツール。おおう。それとごめんトレースだった

2005 ならこんなの見つけたけど
ttp://code.google.com/p/sqlexpressprofiler/
2008/10/17(金) 03:19:46
タイプセーフなデータベースプログラミング
ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275

拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。
2008/10/17(金) 17:46:42
Entity FrameworkをLinqなしで使うと2番目の例っぽくなるね。
2008/10/17(金) 19:35:37
多言語でLinqのパクリを作ろうと思っても、言語仕様のサポートが無いと
ああいう風にせざるをえないんだよな。
2008/10/17(金) 22:35:24
まあ、だからC# 3.0がああなったわけで。
2008/10/17(金) 22:53:01
その辺Booなら自分で言語使用作れるかと
2008/10/18(土) 10:13:17
実際に動くものを作ってから言え
257デフォルトの名無しさん
垢版 |
2008/10/27(月) 22:19:23
時間ができたので久しぶりの >>1 です、だんだん慣れてきた、半年続けた結果分かったことLINQスゲー使えます
という訳でみんなこれ勉強しろ!!
とりあえずアドバイス、まずは yield return / yield break が自在に使いこなせるようになるといいです。

使い方のコツ

 1.シーケンス( IEnumerable<T> 、データベースで言えばテーブル)の生成
 2.from ... または System.Linq.Enumerable で加工(繰り返し)
 3.ToArray() , ToList() , ToDictionary() , All() , Any() 等で結果生成。

これが標準パターン

 元の列を作る → 加工 → 加工 ・・・ → 加工 → 配列化

基本的にこればっかりです。
ちなみに LINQ が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。
いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと
やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、
無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。
2581
垢版 |
2008/10/27(月) 22:20:21
とにかく『加工元が簡単に作れない』事には、LINQ は使い物になりません。
という訳でシーケンスの作り方のコツ
配列やList等は、IEnumerable<T> 持ちなのでそのまんまシーケンスその物である、これは当たり前。

*.バラバラな物をシーケンスにするコツ、『適当』に yield return をばらまく
 このあまりに馬鹿らしく単純な使い方になかなか気付けなかったw
 例
 class Test {
  int A;
  string B;
  // メンバーを片っ端からシーケンスにする
  IEnumerable<object> Members() {
   yield return A;
   yield return B;
  }
  public override bool Equals(object obj) {
   Test obj2 = obj as Test;
   if(obj2==null) return false;
   return this.Members().SequenceEqual(obj2.Members());
  }
  public override int GetHashCode() {
   return this.Members().Aggregate(0, (acc, element) => acc ^ element.GetHashCode());
  }
 }

*.IEnumerable<T> を持っていないライブラリの古い糞クラス用にアダプターやヘルパー関数をたっぷり作っておくこと!!
 例
 IEnumerable<T> CreateEnumerable<T>(Func<int> getCount, Func<int, T> getItem) {
  for (int i = 0; i < getCount(); ++i) yield return getItem(i);
 } 標準で .Net Framework に準備して欲しい・・・
2591
垢版 |
2008/10/27(月) 22:21:21
二以上のシーケンスを同時に加工するときのコツ
1.ToArray() , ToList() 等で、一旦配列にする。
2.Enumerable.Range( 0 , seq.Count() ) で配列の添え字を列挙して使う(なかなか気付けなかったw)

 例
 var tmp1 = 元シーケンス1.ToList();
 var tmp2 = 元シーケンス2.ToList();
 var tmp3 = from index in Enumerable.Range(0,tmp1.Count-1)
       select new { tmp1[index] , tmp2[index] };

3.ToDictionary や ToLookup を使って連想配列を経由するとさらに色々な事が簡単に
4.他にも色々便利なコンテナもあるので To○○ を拡張を沢山作っておくのがコツ
 標準で .Net Framework に準備して欲しい・・・
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況