1 名前:デフォルトの名無しさん [2008/02/09(土) 23:51:34 ] VisualStudio2008より追加された便利で強力な機能 統合言語クエリ (LINQ : Language Integrated Query) ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。 関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。 DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する 言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。 質問、便利なマイテクニックの発表、いろいろやっちゃってください。
63 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:07:54 ] DB屋もやってる俺からみると、これはぶっちゃけキモい 変にSQLの知識あるとちょっと慣れそうにないなぁ、これは
64 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:29:39 ] >>63 俺も一応オラクルマスター持ちなんだが(システム屋から足を洗って長いけど)、 それはそれ、これはこれだな。 DBとだけ使っている限りは、SQL以上のことができるわけじゃないから「ただのキモいSQL」という見方も、そう間違ってはいないだろう。 SQLを基準にして見れば、SQLとの違いが気持ち悪いのは確か。しかし、メモリ上のデータのグループ化やら結合やら、定型的なわりに再利用しづらいコードを いちいち書いては「こんな処理、SQLならSELECT文一発なのに」と思っていた人にとっては、むしろSQLに近づいた感じなのではないだろうか。
65 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:53:13 ] OOP 言語が SQL に近づいたこと (より「意図通りに書ける」ようになった)も重要だし、 in-memory オブジェクト、XML、DB に対して ほぼ同じ書式でクエリが書けることも重要かと。
66 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:41:50 ] LINQとSQLの違いのひとつにプランナの有無がある。 LINQは処理順に書かなくてはならないし、必ず記述順で処理される。 LINQはSQLの類似品と考えるより、 Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり コレクション処理の延長だと思ったほうが誤解がない。
67 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:31:55 ] >>63-66 いずれ統一化できる下準備になるのではないかと思っています。 最終的には、コンパイル済みの.NETのコードを直接 DB に送り込み、DBがそれを直接解釈するという形になるのではと想像しています。 そうしますと、C#/VB.NETで書かれたSQLとDBのSQLの微妙な解釈の違いが完全になくなると思うので、これは安心できると思うのですがどうでしょう? あと、コンパイル済バイトコードを送りつけるなら、DBのスピードもあがるかもとかとか・・・ また、セキュリティーの関係ではSQLインジェクションの類は完封できそうです。 >>1 です、今日は、表の分割、行の分類のやり方を紹介します。
68 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:32:46 ] Q.表を分割したい LINQの文法は、例えば以下のような形式になっています。 from アイテム名 in 元データ where アイテム名.項目=="条件のあっているデータ" select 新しい行の定義 上記の文の最後の部分「select 新しい行の定義」の部分を「group 新しい行の定義 by ふるい分けの基準となる値」 とする事により表を分割できます。 ここでは 1 "ABC" 2 "DEF" 3 "ABC" 4 "DEF" 5 "GHI" となっている表を、以下の三つの表に分割する方法です。 ABC のある列 1 ABC 3 ABC DEF のある列 2 DEF 4 DEF GHI のある列 5 GHI
69 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:33:19 ] ツールボックスから DataGridView と TextBox を三つ貼り付けて以下のコードを実行すると三つの表が完成します。 var tableOrg1 = new[] { new { LineNo = 1 , Data = "ABC" } , new { LineNo = 2 , Data = "DEF" } , new { LineNo = 3 , Data = "ABC" } , new { LineNo = 4 , Data = "DEF" } , new { LineNo = 5 , Data = "GHI" } , }; var dataGridViewArray = new[] { dataGridView1, dataGridView2, dataGridView3 }; var textBoxArray = new[] { textBox1, textBox2, textBox3 }; var tableArray = (from row in tableOrg1 group row by row.Data).ToArray(); for (int i = 0; i < dataGridViewArray.GetLength(0) && i < tableArray.GetLength(0); ++i) { dataGridViewArray[i].DataSource = tableArray[i].ToArray(); textBoxArray[i].Text = tableArray[i].Key.ToString(); } by row.Data の部分を変更することにより、例えばby row.Data.Length などとする事により複雑なふるい分けが可能です。
70 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:34:14 ] Q.特定項目で分類したい 項目に大小比較ができれば、ソートしてしまえば良いのですが、それが無い場合には少し困った事になります。 ここでは、前出の「表を分割したい」と組み合わせた方法を紹介します。 それは、前出のLINQ文「from row in tableOrg1 group row by row.Data」の後ろに「into tmp1 from tmp2 in tmp1 select tmp2」を追加して from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2 とすると実現できます、まじないの部類ですが・・・うまく行きます。 var tableOrg1 = new[] { new { LineNo = 1 , Data = "ABC" } , new { LineNo = 2 , Data = "DEF" } , new { LineNo = 3 , Data = "ABC" } , new { LineNo = 4 , Data = "DEF" } , new { LineNo = 5 , Data = "GHI" } , }; var table1 = from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2; dataGridView1.DataSource = table1.ToArray();
71 名前:デフォルトの名無しさん [2008/02/17(日) 21:35:03 ] linq の文法 query-body ::= query-body-clause* final-query-clause query-continuation? この query-body-clause* の部分が複数になると急に難解になりますね。 どういう時に、使うと見通しが良くなるのか、あるいはどういう時にろくな事にならないのか パターンとアンチパターンを揃える必要がある気がします。
72 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:40:18 ] >>71 >この query-body-clause* の部分が複数になると急に難解になりますね。 とりあえず改行とインデントとletで工夫かな。
73 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:11:36 ] >>1 です、今日は、LINQ文法の詳細をやろうと思ったのですが…… 一通りざらっと見てみて、LINQの文法はひょっとして質が悪いのでは?という疑惑が湧いてきました。 LINQの核心部分は、from join その他 LINQ キーワードではなく、実際の処理が記述されている System.Linq.Enumerable であるので これが致命傷になるとは思えないのですが、簡単に使うための上っ面としては今一な気がします。 このキーワードと文法には、変な汎用性があり、相当な広範囲にわたって複雑な処理が可能ですが それを行うなら、メソッドベースで行ったほうが良さそうな気がします。 1.方向性としては、良くある定型について、LINQ 文法を使って完結に記述。使用例一覧に纏めておき、サクッと使う。 2.例外的なクエリについては、メソッドを使い、一つ一つ区切りながらクエリを完成させる。 こういう使い方が良いのではと思い始めました。 皆さんはどんな意見をお持ちでしょうか?
74 名前:デフォルトの名無しさん [2008/02/18(月) 18:13:51 ] www.microsoft.com/japan/msdn/net/bb308959.aspx より。 今日はこれを、初心者向けの説明にしようと思ったのですが……難しすぎ 区切り無く、際限なく、限りなく書き方が広がるとマニュアル化ができません。 query-continuation? の定義に query-body があるのが最悪だ。 だれがこれを手際よく解説するアイディアお持ちで無いでしょうか? query-body ::= query-body-clause* final-query-clause query-continuation? query-body-clause ::= (from-clause | join-clause | let-clause | where-clause | orderby-clause) join-clause ::= join itemName in srcExpr on keyExpr equals keyExpr (into itemName)? let-clause ::= let itemName = selExpr where-clause ::= where predExpr orderby-clause ::= orderby (keyExpr (ascending | descending)?)* final-query-clause ::= (select-clause | groupby-clause) select-clause ::= select selExpr groupby-clause ::= group selExpr by keyExpr query-continuation ::= into itemName query-body #ひょっとしてカンマ忘れてる? #orderby-clause ::= orderby (keyExpr (ascending | descending)? ,)*
75 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:52:44 ] >>73 LINQ って言葉の指す範囲は広くて、クエリ式もメソッド形式もどっちも LINQ よ。 from x in list みたいなのはクエリ式。 クエリ式でないと書きづらいのは、多重 from と join と let くらいかな。 まあ、transparent な変数が絡むとクエリ式使わないときつい。 逆に、クエリ式で書けないことも実に多い。 まあ、個人的には、 クエリ式で書けるものは全部クエリ式で、 それ以外だけメソッド形式で書いてる。
76 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:56:38 ] >>74 俺は 基本的に、select と group by は最後に来る。 その後ろにさらにクエリを続けたい場合は into x を置いてからさらに続ける。 と説明してる。
77 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:00:39 ] 対応関係としては、 from x in list where x > 0 select x; ↓ list.Where(x => x > 0); // 最後の Select はきえる from x in list select x * x; ↓ list.Select(x => x * x); from x in list select x * x into y where y > 5 select y; ↓ list.Select(x => x * x).Where(y => y > 5); // .Select の後ろにさらにメソッドが続く
78 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:08:01 ] >>1 お前社員だろwwwwwww こんなの広めてどうするwwwwww
79 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 04:36:32 ] Hibernate とは違うの?
80 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:09:28 ] >>79 後出しじゃんけんの分強い 対象が Java か .NET か LINQ では、C# や VB の言語仕様もいじったから書きやすい
81 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:48:34 ] >>1 です、一週間では見えてくるものが少ないですね、暫く使い込んでみることにしました。 Linq to SQL , Linq to XML , 生Linq と全部使い込みをしないと見えてきにくいですね。 >>78 おれ社員じゃないよ、ボーランド大好きヘジたん信者の可能性は高いけど(笑 それと食わず嫌いはどうかなwwww 問題もそれなりに多そうだなというのも見えてきましたけど開発効率めちゃくちゃ高いよぉ。
82 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:25:54 ] >>79 簡単に言うと、O/Rマッピングは対症療法、LINQは原因療法、みたいな。 なんでこんなのが必要かってのは、 ttp://d.hatena.ne.jp/fromdusktildawn/20060216/1140064918 を読むと理解が深まるかも。
83 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:16:01 ] LINQ最大の効果ポイントは、一般化と高速化にあるんじゃないかな データベースから、XMLから、果ては適当なクラスや構造体まで統一手法で操作可能という点。 O/Rマッピングと目指すところがそもそも違うと思う
84 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:14:52 ] キャッシュポリシーは単純だけど、Linq to SQLはORM。 これだけはほかのと系統が違う。これで使うラムダ式は特殊なもの。
85 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 23:37:59 ] ( ゚д゚)ノ ハイ!シツモーン!です。 次のように追加してくと実行時間がリニアに増えてくんだけど何か間違えてるんでしょうか? プロジェクトごとあげてみました。 www.borujoa.org/upload/source/upload16875.zip class Program { static void Main(string[] args) { var db =new TestDB(@"testDB.sdf"); db.DeleteDatabase(); db.CreateDatabase(); var count=0; var tu=new TickUtil(); tu.WriteLine("begin--"); while(count++<5000){ var person=new Person{Name=string.Format("name-{0:8d}",count), Age=count,Explanation=string.Format("Explain-{0}",count)}; db.Persons.InsertOnSubmit(person); db.SubmitChanges(); if(count%100==0) tu.WriteLine("new person-count={0}",count); } tu.WriteLine("end-"); } }
86 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 01:06:41 ] LINQでWin32のメッセージマップって書けないの?
87 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 01:43:02 ] C++/CLI には無いの?
88 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 07:12:47 ] >>85 遅くなるというのは1件あたりの処理時間が増えるということかな? それだったらCompact Editonなのが影響してるのかもしれない。 2005Expressで実行してみたらどうだろう。 db.SubmitChanges(); は5000件まとめての方が速いと思う。 メモリがきついようなら500件くらいまとめてで。
89 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 08:46:06 ] >>88 百件のインサートごとにその間にかかった時間を書いてるんですが、それがリニアに増えてきます。 Express or Serverで試してみます。 実際の実行時はまとめたほうがよさげですね。
90 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 10:05:01 ] >>85 のソースから > protected string SetAndReturnDifferenceTimeString() { > int current = Environment.TickCount; > int lastDiff = current - _last; > _last = current; > return "[" + lastDiff + "]"; > } > public void WriteLine(string message) { > Console.WriteLine(message + " " + SetAndReturnDifferenceTimeString()); > } > public void WriteLine(string message, params object[] args) { > WriteLine(string.Format(message, args)); > } 100件毎に実行されるのってWriteLine(string message, params object[] args)じゃね? 最近プログラミングしてないんで間違ってたらスマソ
91 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 10:13:41 ] >>90 下のWriteLine()の中で上のを呼んでる。
92 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:11:14 ] >>1 です クエリ式はとりあえず放って置いて、メソッドでしか表現できないタイプのものを解説してみようと思っているのですが まずは一発目で Aggregate あたりからやってみようかと思ってます。 ただ、このメソッドあまりにも関数型言語らしい仕様をしています。 何か良い説明方法はないかと色々さがしているのですが、良いのがあったら誰か紹介してください。 d.hatena.ne.jp/blanketsky/20071129/1196329379 とりあえず、この辺りとか見てみたのですが…… こんなの見せられたら初心者さん気絶するよなとか思いつつ、何かいいのはないかなと……
93 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:32:05 ] >>92 forループからの置き換えで解釈してみては。 int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } これをAggregateで記述するとどうなるか、とか。
94 名前:85 mailto:sage [2008/02/22(金) 00:39:59 ] Comapctでまとめて実行するようにしたらリニアに増加するのはなくなった様。 10000件ぐらいまではまとめたほうがトータルの実行時間が短くなった。 もっと多くした場合はどうなるかは今度試します。 ほかのデータベース試してないけれど、なんかCompactのせいっぽい匂いが・・・
95 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:20:37 ] >>92 その情熱がどこから来るのかわからんが、Aggregateなら ・sum、factあたりを通常の再帰関数で書く ・共通する部分を抜き出す ・これがAggregateです っていうのがわかりやすいんじゃないの?
96 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:23:52 ] >>92 ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate
97 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:46:15 ] クエリ式はきもいけどLINQ自体はないと生きていけんよ コレクションに対するアルゴリズムは絶対に必要だ XMLやSQLは別になくても生きていけるとは思うが
98 名前:デフォルトの名無しさん [2008/02/22(金) 22:13:52 ] >>92
99 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:08:33 ] >>1 です >>93 結局ループをどの様に書くかという問題なのだからそれが一番いいような気がしました。 それと、これは群論の本(数学の本です)を読んでいて、抽象化は具体例を限りなく沢山作ってその中から共通の物を取り出すことだという記述があって それも考慮にいれて、まず具体例、それからループへと展開する方針でいってみようと思います。 >>95 申し訳ないですが、再帰は最終手段だと思います、非常に良くないと思います。それ以外の部分は賛成です。 再帰とラムダ(or Delegate)は絶対に最初に記述して説明してはならないものだと確信しています。 >>96 >ufcpp.net/study/csharp/introduction.html >実を言うと、僕は趣味でプログラミングをしてるだけで、 C# は研究とは一切関係なかったりします。 >(むしろ C/C++ を使うことが多かった。 2007年追記: 最近では割となんでも C# で書くようになりました。) >初めて C# について調べてみたとき(ちょうど Java に物足りなさを感じ、SUNの方針に憤りを感じていたころです)、 > C# が普及してくれればプログラミングにかかる手間は大幅に削減されると感じるました。 >しかし、Microsoft は順調に行かなさそうなものはばっさりと切り捨てることで有名な企業ですし、 >世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。 >そこで、少しでも早く C# が普及するようにとの願いを込めて当コンテンツを作成することにしました。 実は自分も全く同じ境遇です、でも研究者じゃありません、ただのプログラマですが…… 関数型言語をやっていて思うところで、こんなの一発なのにというコードがオブジェクト指向のスタイルでは全くまともにかけなくて歯がゆい思いをしていました。 今日からお休みなので、これから練ってみます、明後日辺りから書き始めるかもしれません。
100 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:09:33 ] しかし、msdn2.microsoft.com/ja-jp/library/bb549218.aspx これをみて理解できる人間が一体何人いるんだろうか…… Aggregate<(Of <(TSource, TAccumulate>)>)(IEnumerable<(Of <(TSource>)>), TAccumulate, Func<(Of <(TAccumulate, TSource, TAccumulate>)>)) この表現からぱっと見た目に使い方がわかる人は一体何人いるんだろうと、首を傾げそうになります。 ドキュメントのつくりを一度見直すべきだと思う……強力なのに…… >世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。 こんな状態になって欲しくないです これを使えば、エクセルで小計等をやるような操作を一行で書き下せますが、使える人が居なくなってしまう。
101 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:22:13 ] C++にBoostその他の取り合わせなんか、正にそんな世間の関心が低い状態。 LINQもそういうことになってしまうのは嫌だな。
102 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:31:52 ] 一応世間に知られてからもう大分経つでしょ・・・ これ流行らないよ・・・ from の位置とか外人さんでも気持ちわるいんじゃないかな
103 名前:95 mailto:sage [2008/02/23(土) 02:36:28 ] >>99 あー、ごめん、関数型言語とごっちゃになってた。 C#なら95の最初の手順を ・sum、factあたりを通常の関数で書く でいいな。確かに再帰とかいらない。 蛇足ですが、あなたの対象とする「初心者」像がいまいちわからないのが 少し気になります。
104 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:22:34 ] >>102 発売後15日にして大分経っていたのか、それはショックだw ごみレスつけるな、よそ行けよ
105 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:15:51 ] Selectが X->Y のマップになってるのはちょっと名前がわかり辛くて見つけられなかったな duck typing(?)とかいう手法で Map :: X[] -> (X -> Y) -> Y[] を作っちゃった 拡張性も結構あるしガクジュツ的ではなくちゃんと実務に沿って開発しやすくなるような言語拡張だからLINQは流行ると思う
106 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:41:16 ] Enumerable.ForEachがほしい
107 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:51:39 ] 要望出してSP1に入れさせようぜ
108 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:52:38 ] >>106 自分で作りなはれ。自分は作った。
109 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:56:38 ] 晒して
110 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:10:50 ] void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach(T item in source) action(item); } ただこれだけのことだけど こんなことしちゃうとコード全体がガラッと変わるから非公式にやるのは抵抗がある
111 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:17:25 ] なんでもかんでも一行でやろうとするのはC#的じゃないだろ foreachぐらい分けて書こうぜ
112 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:42:04 ] www.microsoft.com/japan/msdn/net/bb394939.aspx ヘジ自ら書いてる これが俺のバイブル
113 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:44:36 ] foreachのみで簡潔に書けるものはforeachのみで良いと思います foreach( var row in table ) 文 ; これ以上何かをする必要はないだろうと思う、逆にややこしいだけだし。 はなしは変わって、ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate によると > でも、メソッド提供だけでは、 join や let などがどうしてもきれいに表現できなかったので、 <やむなく SQL 風のクエリ式を導入したそうです。 >(プログラミング言語の中に別に言語を埋め込むというのはデメリットも大きくて、 >言語制作者にとっては結構ためらわれる行為。) >(join や let をきれいに書くためには、どうしても透過識別子のような考え方が必要だった。) という事らしいのですが、私は、むしろ逆で、これを見た瞬間λ式消滅、これは素晴らしい!! と思ったものなんですが…… "Language Integrated" Query というぐらいですから、最初こちらがあったのだと想像していのですが逆だったんですね。 foreach にはλ式は登場しないので十分だと思っています。
114 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:47:27 ] デザイナを使っているとdelegateやeventなんて全然意識しやいじゃないですか ダブルクリックすれば勝手にコード登場となって、こういうややこしいものは後回しにして使い方を最初に知ることができる。 これがC#の良い点だと思うんですよ。
115 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:50:49 ] List<T>やArrayにはForEachがあるだろ 匿名メソッドよりも,普通のメソッドを直接渡すときに気持ちいいんだよね list.ForEach(Console.WriteLine);みたいに 初めてみたときはびっくりしたけど
116 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:59:23 ] 普通にプログラミングしててもSelectやWhereは腐る程出てきて それらを書くぶんにはクエリ式でなく拡張メソッド+ラムダ式の方がシンプルに書ける ラムダ式は他にもプログラミングのあらゆる局面で使うと便利なことが多い 対してクエリ式はSelectManyやJoinなんかで使うとシンプルに書けるけど そんなん滅多に使わん
117 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:43:25 ] 遅延評価のせいで,一旦必要な部分を評価しないといけないのか・・・ new[] { 1, 2, 3, 4, 5 }.Select( x => { Console.WriteLine(x); return x; } ).ToArray();
118 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:06:36 ] 遅延評価の問題すっかり忘れてた、あんまり意識する必要無いとおもったけど、デバッグ時にも面倒が起りますね。 あなたがその値を見るまでは値は計算されていませんって、まるでシュレディンガーの猫のような現象がありました。
119 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:24:47 ] 普通に書いたらええがな
120 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:29:18 ] .ToList().ForEach(Console.WriteLine) でいいじゃん
121 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:30:33 ] ToList超きもい
122 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:32:42 ] 遅延評価はLINQだと実態があいまいになりがちだがHaskellを使うと、なんというかテツガクしたくなる。 ものすごく面白いが、万人にお勧めではない。
123 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:35:44 ] IEnumerable<>でforeachするときの例っぽいの書こうとした^p^
124 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:00:07 ] >>1 です ちょっとスタイル変更、くだすれC#だと、配列よりも List クラスの方が需要ありそうだったので。 実際、実用上は配列って事はありえない気がしますし。 名前は全部漢字にして、型名には末尾に"型" と付けてみました。
125 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:00:49 ] Q.売上表で小計をもとめるような計算をしたい(1) Aggregate が便利です。 以下の例では、合計原価と合計売価を求めます。解りやすさ優先で、型をすべて書ききったバージョンです。 System.Collections.Generic.List<売上帳の行型> 売上帳 = new System.Collections.Generic.List<売上帳の行型>(); 売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 }); 売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 }); // お試し表示 dataGridView1.DataSource = 売上帳; // 合計の計算方法 合計型 合計の初期値 = new 合計型() { 合計原価 = 0, 合計売価 = 0 }; 合計型 合計表 = 売上帳.Aggregate( 合計の初期値, (合計型 直前の合計, 売上帳の行型 行) => new 合計型() { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 } ); dataGridView2.DataSource = new 合計型[] { 合計表 }; public class 売上帳の行型 { public string 品名 { get; set; } public int 数量 { get; set; } public int 原価 { get; set; } public int 売価 { get; set; } } public struct 合計型 { public int 合計原価 { get; set; } public int 合計売価 { get; set; } }
126 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:01:50 ] >>125 の続き 売上表で小計をもとめるような計算をしたい(2) 省けそうな型名は省略したバージョンです var 売上帳 = new System.Collections.Generic.List<売上帳の行型>(); 売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 }); 売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 }); // お試し表示 dataGridView1.DataSource = 売上帳; // 合計の計算方法 var 合計表 = 売上帳.Aggregate( new { 合計原価 = 0, 合計売価 = 0 }, (直前の合計, 行) => new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 } ); dataGridView2.DataSource = new[] { 合計表 };
127 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:03:01 ] >>126 の続き 売上表で小計をもとめるような計算をしたい(3) 上記のコードが何をしているのかといいますと、以下のコードのような処理をしています。 var 売上帳 = new System.Collections.Generic.List<売上帳の行型>(); 売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 }); 売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 }); // お試し表示 dataGridView1.DataSource = 売上帳; // 合計の計算方法 var 直前の合計 = new { 合計原価 = 0, 合計売価 = 0 }; foreach (売上帳の行型 行 in 売上帳) { 直前の合計 = new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 }; } dataGridView2.DataSource = new[] { 直前の合計 };
128 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:04:24 ] >>127 の続き 売上表で小計をもとめるような計算をしたい(4) これを使うと簡単になるケース 合計型と売上帳の行型が同じなら、コードは単純になります var 売上帳 = new System.Collections.Generic.List<売上帳の行型>(); 売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 }); 売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 }); // 合計の計算 var 合計行 = 売上帳.Aggregate((直前の合計, 現在の行) => new 売上帳の行型() { 原価 = 直前の合計.原価 + 現在の行.数量 * 現在の行.原価, 売価 = 直前の合計.売価 + 現在の行.数量 * 現在の行.売価, 品名 = "合計" }); 売上帳.Add(合計行); // お試し表示 dataGridView1.DataSource = 売上帳;
129 名前:デフォルトの名無しさん [2008/02/27(水) 19:05:23 ] まとめ 駄目だ、どうあがいても単純になりません。 3 番目を書いてみたら、foreach で書いたほうが見通しがよさそうな感じすらしてきます。 綺麗になるのは、アキュムレーターの型とコンテナ要素の型が一致しているとき もしくはアキュムレーターの型が int のような単純型で有る場合に限られます。 メソッド方式にはやはり何かが足りない感じがします。 LINQの新規キーワードとして、それも foreach をイメージできるような構文にして "aggregate 売上帳" と書いたら、型名、その他をインテリセンスがズバズバッと書き出して、 作る側は中身をを書くだけといった具合になれば使えそうな気がするのですが…… もしくは Excel の、式のコピーのようなイメージができれば、やる事は一番上の式を書く事となるのですが。
130 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 02:02:30 ] ところでこのコードってVB?
131 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:52:14 ] 驚くべきことに今まで一行もVBのコードは出てきていないんだ
132 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:47:55 ] ほいじゃVB版Linq for XML XMLリテラルが売りですのじゃ Dim xm = <AAA> <BBB id="1">aaaaacxzc</BBB> <BBB id="2">aaaaaxczx</BBB> <BBB id="3">aaaaaxcxz</BBB> <BBB id="4">aaaaaxczx</BBB> <BBB id="5">aaaaaxxxx</BBB> <BBB id="6">aaaaazzzz</BBB> <BBB id="7">aaaaacccc</BBB> <BBB id="5">aaaaaxxxx</BBB> <BBB id="6">aaaaazzzz</BBB> <BBB id="7">aaaaacccc</BBB> </AAA> Dim rs = From x In xm...<BBB> _ Where x.@id > 2 _ Distinct Skip 1 Take 3 _ Order By x.@id Descending _ Select ID = x.@id, x For Each r In rs Console.WriteLine(r) Next
133 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:15:08 ] クエリ式はC#よりVBの方が馴染んでるよなあ VBのラムダ式は糞だけど
134 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:54:04 ] >>129 AggregateはSumやMaxと同じで集合関数として使うように設計されてるので group by と組み合わせて使うのが普通なのだと思う。 この例だとSumが使えるのだがAggregateを使ってみた。 var 合計表 = ( from uri in 売上帳 group uri by 1 into g select new 合計型(){ 合計原価 = g.Sum(o => o.原価 * o.数量), 合計売価 = g.Aggregate(0, (t,o) => t + o.売価 * o.数量) }).First(); Console.WriteLine("{0}, {1}", 合計表.合計原価, 合計表.合計売価);
135 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:17:17 ] C#なんだから大概の物は関数型チックにかくより普通に書いた方が 見やすいのは当たり前
136 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:55:15 ] Expression Treeってフィールドの値を変更できないのか できたらおかしいのはわかるけどDynamicMethodの簡易版として使うには貧弱だな
137 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:01:30 ] >>136 そういう用途だと、LINQ の Expression から DLR の AST Expression に変換してしまうのがいいかも。
138 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:40:05 ] LINQってDataTableに対してグループ化をしてDataGridViewに表示したり出来るんですかね? 現在、DataTableに対してグループ化ってかなり無理矢理やらないと出来ないと思うんですが、 これができると、DataTableがかなり使いやすくなりそうです。 .NET3.5をインストールさせる動機になりそうなくらい・・・
139 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 12:24:53 ] みんな小難しいことばっかやってて、なんとなくLinq避けてたが、 実際に使ってみるとなかなかスイーツ(笑)な簡単さじゃないか。 List<T>なんか作って追加していって最後にToArray()してるようなのも Linqで書き換えたら全部一行に出来そうだ。
140 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:52:23 ] あれ?出勤、昼だか夜だかわからなくね?
141 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:30:56 ] VB.NETもスレタイの仲間に入れてあげてください。
142 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 13:24:30 ] VB.NETは新機能が全く話題にならないよな
143 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:06:20 ] >>142 むしろ新機能はLINQ以外にあったっけか? まぁ銀光とかあるけど
144 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:07:51 ] 宣言時の型推論,ラムダ式とか?
145 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:16:04 ] Xmlリテラルとか。
146 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:18:19 ] C#2.0+C#3.0+αだな
147 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:24:25 ] ぶっちゃけXML生書き出来るようになったからって・・・ 使う奴っている? 今一歩使い道が見つからん・・・
148 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:19:44 ] >Xmlリテラル タイミング良くっつーかこんな記事がでてるね。 .NETプログラマーにとって、XSLTは終焉なのか? ttp://www.infoq.com/jp/news/2008/03/XML-Literals >XML Literalsは最初Haskell向けに開拓され、 >のちにMicrosoftにおいてC#で使用するために開発された。 >どちらの言語においてもうまく いかないことが判明したので、 >Visual Basicチームが飛び付いて、VB 9の礎石にした。 >これはそれほどまでに驚くことではない。 >というのもHaskell構文がVBScriptのインラインHTML表記の影響を >もろに受けて いたからである。 まあヘジたんなら拒否るだろし、事実拒否ったんだろうなぁ。
149 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:40:14 ] テーブル値関数をLinq to SQLで利用しようとしてるんだけど、 実行したら、 ストアド プロシージャはクエリ内では使用できない。ってエラーになるんだよ。 これバグじゃないかな。
150 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 00:46:01 ] 自己解決しました。ノシ IsComposable=true がなかったのが原因みたいです。 なんだかなあ。
151 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:35:46 ] 保守
152 名前:sage [2008/04/13(日) 01:33:35 ] LINQでのサブクエリの書き方が分からん。どう書くの? SELECT A.KEY1, A.COL1, B.COL2 FROM ( (SELECT * FROM TBL1) A INNER JOIN (SELECT * FROM TBL1) B ON B.KEY1 = A.KEY1 )
153 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 02:32:31 ] そのままlinqに置き換えれば var r = from i in (from a in TBL1 from b in TBL2 where a.KEY1 == b.KEY2 select new { A = a , B = b }) select new { KEY1 = i.A.KEY1 , COL1 = i.A.COL1 , COL2 = i.B.COL2 }; こんな感じだけど、この例だとサブクエリ必要なくね?
154 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 02:36:53 ] >>152 それ、LINQ だとサブクエリ要らない。 var q = from a in tbl1 join b in tbl2 on a.Key equals b.Key select new { a.Key, a.Col1, b.Col2 }; サブクエリは普通に ↓ みたいに書ける。 from a in from b in list select b.SomeProperty select a.SomeProperty
155 名前:デフォルトの名無しさん [2008/04/13(日) 14:50:18 ] そんなことしなくても 保守が容易な綺麗なコードを書けるから (゚听)イラネ
156 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 16:44:19 ] 最近LINQ初めて>>22 見たんだけど、 コードが見通しよく整理されていく中盤からの展開は見てて痛快だなぁ
157 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:22:23 ] code.msdn.microsoft.com/vlinq
158 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:41:48 ] >>157 Visual LINQ Query Builder VS2008用のアドインか
159 名前:デフォルトの名無しさん [2008/05/24(土) 20:45:08 ] Linqで書くと速くならないなら需要ないんじゃない SQLでおなかいっぱいで
160 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 21:01:08 ] >>159 LINQ の価値は速度じゃなくて、 OOP パラダイムと RDB パラダイムの懸け橋になること。 SQL でおなかいっぱいって人にこそ LINQ がいいんじゃないか。
161 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 23:11:23 ] パラ? お母さんが子供に教えるように教えてください
162 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 23:23:16 ] >>161 C# の中で、オブジェクト指向言語の感覚からあまり外れることなく、 データベース問い合わせが書けるってことが大事。
163 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 00:22:26 ] 最初は書き方に戸惑うが、だいたいの書き方がわかってくればインテリセンス使えるのがとても大きい
164 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 04:39:07 ] コンパイラによる構文チェックが行われるというのも大きい。 条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて バグを作り込んでしまうような、つまらないミスを防げる。 DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に つながる要素がいろいろあるよ。 俺もほとんど把握してないけどさ。
165 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 09:04:21 ] SQLって、汎用コレクションデータ処理エンジンだね。 C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、 コードを作りこまなくちゃいけないけど。 RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。 例えるなら文字列の正規表現みたいな感じで。 それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう ってのは便利。
166 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 09:41:44 ] >>161 インピーダンスミスマッチでぐぐれ
167 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 11:12:57 ] SQLMetalってすでにあるテーブルのオブジェクト定義のXMLを生成するものだよね? 逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?
168 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 14:02:32 ] >>167 方法 : データベースを動的に作成する (LINQ to SQL) msdn.microsoft.com/ja-jp/library/bb399420.aspx
169 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 14:39:10 ] >>161 これでも読め www.microsoft.com/japan/msdn/net/bb425822.aspx
170 名前:デフォルトの名無しさん [2008/06/02(月) 22:49:47 ] Linq人気ないから救済でAgeてやる 感謝しろビル
171 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:38:01 ] PL/SQLですね。
172 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 11:06:00 ] pc11.2ch.net/test/read.cgi/tech/1212972014/
173 名前:デフォルトの名無しさん [2008/06/15(日) 19:33:30 ] えーい Linqも人気ないけど ダメ技術のかほりがすっぞ
174 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:07:55 ] 使ったからといって、別に何かが楽になったりすっきりしたりするように見えないんだよな。
175 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 07:25:18 ] ちょっとしたDBアプリ作るの楽になるが。 XMLとかにもいいと思うよ。
176 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:00:53 ] メソッド形式は手軽に使えてすごく便利だよね クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない
177 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:19:07 ] 未だにクエリ式だとpとかqとかのスコープがよくわかってない俺。
178 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 03:55:30 ] fromやletが沢山必要になる場合は クエリ式を使ってる けど、それ以外ではクエリ式は全然使ってない
179 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:35:19 ] 使い方も確立されてない未知のもんだからな。 ポテンシャルは高い気がする。
180 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 00:55:26 ] LINQきれいにかけるけれど、特にObjectLINQだと効率的にはだめな場合もあるからなぁ。 微妙なところだ。 PLINQとかになるとまた話は違うだろうけれど。
181 名前:デフォルトの名無しさん mailto:sage [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 の問題は解消しない。
182 名前:デフォルトの名無しさん mailto:sage [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年半ぐらいかかったし。 出荷までの時間短縮はお金じゃ解決しづらいんだろうな。
183 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:07:06 ] >出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。 不等号逆だった…… ポテンシャル: DryadLINQ>>>>>PLINQ 出荷までにかかる時間: PLINQ<<<DryadLINQ
184 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:10:04 ] >C# 3.0もお披露目から1年半ぐらいかかったし。 あとこれもお披露目から2年半の間違い。
185 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 10:41:48 ] もうちょっと落ち着いて!
186 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 01:03:41 ] いや、勢いあったほうがよい
187 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 22:42:17 ] 複雑なXMLファイルの読み込みはXmlTextReaderよりLINQ to Xmlを使ったほうが簡潔に書けそうですか?
188 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 22:53:07 ] 書いてみろ
189 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:23:38 ] >>188 一言レスって周りにも意図伝わらないからヤメレ
190 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:26:55 ] 最近、勉強ついでにLINQtoSQL使ってるけどクラスとして扱えるだけで便利すぎ。 リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。 長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。
191 名前:>>188 じゃないよ mailto:sage [2008/07/07(月) 23:30:39 ] >>189 自分で書けばわかるって事だろ? 意図理解できないのは君だけだと思うが。
192 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 10:10:04 ] XmlElementとXElementの違いを問うならわかるが、 XmlReaderと比べるあたり自分では何も調べずに 思いつきで書き込んだと証明してるようなものだ。
193 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 23:25:23 ] >>191 二つコードを書けということですね、わかります
194 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 23:47:33 ] なんか俺のせいで荒れてるみたいだな ごめんなさい >>192 違いの話なんかしてないっすよ? あれからbuilderってサイトのサンプルを読んで勉強してみてる。 ちょっと興奮で震えてます。 皆ありがとう
195 名前:デフォルトの名無しさん mailto:sage [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も対応できる。 扱いは当然ややこしい。
196 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 13:29:59 ] 意外に使いやすいよねXmlReader/Writer
197 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 20:38:17 ] マイクロソフト公式解説書としてLINQ本が出るってよ LINQテクノロジ入門 ec.nikkeibp.co.jp/item/books/A04100.html ・07/22発売 3,360円(税込み) B5変 280P
198 名前:197 mailto:sage [2008/07/27(日) 00:32:31 ] 届いたんでぼちぼち読み始め 図表を多く使っていて、C#/VBのサンプルコードも多いのは○ 内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。 ・C#/VB・SQLに関する基本的な理解は必須。 ・開発経験のない初心者が読むには少し難しい。 ・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。
199 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:55:18 ] LINQのProviderでしたっけ?クエリーとかを実装する側の作業についてまとまってるarticleとかってありますかね?(´・ω・`)
200 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 11:06:25 ] >>199 単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。 LINQ to SQL みたいなことしたければ、 LINQ の勉強というよりは、Expression Trees の勉強が必要。 で、LINQ がらみの記事は結構おおいけど、 Expression Trees はあんまり見ないなぁ。
201 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:23:14 ] >>200 それです、それ。 具体的にどこまでのExpressionTreeをどんな風に実装したらいいのかが・・・
202 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:55:38 ] Expression Trees の方は、↓に多少サンプルあり。 ufcpp.net/study/csharp/sp3_linqreconstruct.html LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。
203 名前:デフォルトの名無しさん mailto:sage [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
204 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 11:34:15 ] >>198 LINQの本が少ない中、この本はお薦め。 LINQを構成する基礎や、現在のバージョンで、できる事できない事、 やってはダメな事が書かれている。 .netとSQLを使って仕事している人ならLINQがどういう物か理解できる。 少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。
205 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 18:22:46 ] LINQは、VSに付いてくるC#のサンプルコードだけで十分理解できるでしょ。
206 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 23:44:43 ] LINQがこれから他のテクノロジとどう統合されてくのかよくわからん(´・ω・`)
207 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:10:28 ] > どう統合されてくのか 消えていくと言う運命もあるから、俺はもう少し様子見。
208 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:59:30 ] これだけ言語に食いこんだものが消えるというのはありえないと思うが。
209 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 06:48:16 ] いや、互換性のために機能としてはずっと残るかもしれないけど 新規には誰も使わなくなって結局放置と言うこと。 まあ、特攻する人も必要だから、>>208 は頑張ってくれ。
210 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 09:00:39 ] 小手先の道具として便利なLINQ to objectsくらいは残るでしょ そのほかはともかく
211 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 21:35:34 ] 別に「残らない」なんて断定してるわけじゃないよ。 俺はなくてもあまり困ってないし、「残らない可能性もある」ので ちょっと様子見してるだげ。 いいと思う人はどしどし使って広めてくれ。
212 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:25:27 ] LINQ便利ざんすよ? 特にLINQtoSQL。XMLはしらんがたぶん便利だろう。 今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。
213 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:38:08 ] LINQ の意義の1つに、コレクションに対する操作がらみのメソッド名を統一したってのがあるから、 今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、 コレクションとかサーバ問い合わせ系のライブラリ書く人は おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。 そういう意味では、廃れないと思うんだが。 クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、 命名規約の部分に関しては絶対残る。
214 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:43:37 ] MS の技術が「なくても困らない」と感じるのは、 MS がエンタープライズ相手の商売してるから、 個人で趣味で開発してる人へのアピール弱いせい。 あんまりホビープログラムでDBアプリとか書かないし。
215 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 00:10:13 ] LINQはEntity Frameworkなんかと密接に関わるからねー まだまだこれからの技術。
216 名前:デフォルトの名無しさん mailto:sage [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だけで上手く書き直す方法ないんかなぁ。 というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。
217 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:19:42 ] LINQ to SQL 自体、Entity Framework までの繋ぎの過渡技術だし、 今後 Entity Fx の側がよっぽど大ごけしないと LINQ to SQL のグレードアップは見込めない気もする。 LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。
218 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:25:31 ] EntityFWのクエリーインターフェースとして、LINQ使われるんじゃないの?(´・ω・`) 今のLINQのEntityうんたらがもっとしっかりしたものになるということ?
219 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:44:14 ] 裏側の最適化の話ね。 同じ LINQ クエリ式を書いたときに、 実際にどういう SQL 文が発行されるかという、 実装上の最適化の部分に関して、 LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。 まだ手をつけてる人が少なくて情報少ないけども、 将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。
220 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:46:06 ] LINQtoSQLがせいじゅくされてLINQtoEntityになるのかとおもっとった
221 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 20:45:39 ] りんきゅー><
222 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 20:13:37 ] ↓をメソッド形式で書きたいのですが、OrderByメソッドで複数のプロパティで ソートするのははどうすればいいですか? var v = from e in GetFoo() orderby e.Age, e.Name select e OrderBy二回せずに一回でさくっと書きたいです。
223 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 22:32:24 ] >>222 OrderBy(1つ目の条件).ThenBy(2つ目の条件) OrderBy 1回というのは無理。
224 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:14:01 ] >>223 ThenByって知らなかった。ありがと。
225 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 01:50:55 ] つか、そんなの条件式を二つ持つOrderByを自分で実装するがよろし
226 名前:デフォルトの名無しさん mailto:sage [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チームの自己満足だね。いつものことだけど。
229 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:49:16 ] >>228 VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。 Integerってどういう意味だろう、集計対象の型で集計されると思うけど。 VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて 収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。
230 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:30:31 ] VBはラムダ式が冗長だから拡張メソッドでクエリ書くと悲惨なことになる
231 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:54:49 ] 遅延実行と即時評価ってやたら強調されてるけど やっぱりC#のyield知らないとわかりにくいのかな
232 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 23:02:22 ] 言われてみるとyieldを知らない(あまり使った事がない)とすれば 即時実行でないのに違和感を感じるのも分かるな。
233 名前:デフォルトの名無しさん [2008/09/30(火) 11:58:27 ] いまさらだけど、yield Returnつう名前がややこすいよ!!
234 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:43:43 ] yield とかってどこからきたん?関数型?
235 名前:デフォルトの名無しさん mailto:sage [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廃レは確定ぽ。。
238 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:06:53 ] それは LINQ to XML の問題であって、LINQ の問題じゃないのでは。
239 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:54:39 ] LINQ to XMLはもともとXmlDOMやXmlReaderの代替を狙ったものじゃなく、 standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。 はじめからDTDやXMLSchemaはサポートしないことになっていた。 もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。 いっそなくすか、もっと充実させるかどちらかで。
240 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 08:21:03 ] スキーマはサポートしない、って確かにそうなんだけど ぶっちゃけあれ下層に XmlReader が使えるからでは ないのかと
241 名前:デフォルトの名無しさん [2008/10/02(木) 13:10:43 ] LINQはすんばらしい FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。
242 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:46:47 ] C#だとエディットコンティニューが使えないのは結構痛い
243 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:10:47 ] エディットコンティニュかあ、x64だと使えないんだよなあ。 まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。
244 名前:デフォルトの名無しさん [2008/10/11(土) 23:59:11 ] てかLINQってORACLEとかポスグレでも使えるのね。
245 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 00:58:14 ] >>244 LINQ to Entity の出た今となってはね。 MS SQL Server でしか使えないって言われてたのは、 SP1 入る前、LINQ to SQL の時代の話。
246 名前:デフォルトの名無しさん mailto:sage [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を確認する方法を教えてください。
248 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:46:17 ] それは実行される前に?恒常的に? そうじゃないならログ見りゃいいと思うけど・・・
249 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:15:00 ] >>248 実行時でかまいません。 Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。 またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。 探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。
250 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:39:14 ] だから SQL Server なら確かプロファイラ起動してトレースの開始で… と記憶を頼りにぐぐって気づいたんだが Express にはないのか このツール。おおう。それとごめんトレースだった 2005 ならこんなの見つけたけど ttp://code.google.com/p/sqlexpressprofiler/
251 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 03:19:46 ] タイプセーフなデータベースプログラミング ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275 拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。
252 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:46:42 ] Entity FrameworkをLinqなしで使うと2番目の例っぽくなるね。
253 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:35:37 ] 多言語でLinqのパクリを作ろうと思っても、言語仕様のサポートが無いと ああいう風にせざるをえないんだよな。
254 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 22:35:24 ] まあ、だからC# 3.0がああなったわけで。
255 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 22:53:01 ] その辺Booなら自分で言語使用作れるかと
256 名前:デフォルトの名無しさん mailto:sage [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 が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。 いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、 無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。
258 名前:1 [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 に準備して欲しい・・・
259 名前:1 [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 に準備して欲しい・・・
260 名前:1 [2008/10/27(月) 22:22:05 ] ありそうで実は無くて意外不便なもの 1.Excelを使うと良く登場するパータンで、前後の要素にアクセスしながら新しい列を作るような手段が実はない [ ][0] [3][=A2] [4][=B2+A3] [6][=B3+A4] [2][=B4+A5] [5][=B5+A6] 左の列を元に、右の列のようなシーケンスを作る関数を作っておくと便利、汎用関数も簡単につくれる。 これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・ 2.ツリー構造の全要素列挙、汎用関数も簡単につくれる。 これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・ 3.コントロールブレイク(コボラーの必殺技)も作っておくと便利。 COBOLは実は触ったことが一度もないのですが、どうも色々便利ノウハウが彼らにはあるようです。 現在鋭意開拓中
261 名前:デフォルトの名無しさん [2008/10/27(月) 22:22:31 ] Enumerableにある関数は、全部使い込みましょう、特に重要なのは シーケンスを混ぜて一つのシーケンスを作る系 Enumerable.Concat() Enumerable.Intersect() Enumerable.Union() Enumerable.Except() シーケンスの先頭や部分を取得する系 Enumerable.First() Enumerable.FirstOrDefault() Enumerable.Take() Enumerable.Skip() 全シーケンスのチェック、これ以上複雑な物は foreach の方がかえって分かりやすい気がする。 Enumerable.All() Enumerable.Any() Enumerable.SequenceEqual() 要素の型変換、指定型のみ抽出 Enumerable.Cast() Enumerable.OfType() マニュアルが余りに理解不能な文書なので、動作を確かめながら自分の言葉で整理しておくと便利です。 生成用関数、加工用関数、結果生成用関数の三つに分類してみると、すっきりしてきます。
262 名前:デフォルトの名無しさん [2008/10/27(月) 23:24:32 ] サンプル通りにやってもAddの定義が無いのですが‥‥ www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46703&forum=7&2 ぶっちゃけ、この常連しんさんと全く同じ質問なのですが、 この人、質問して、自己解決して、回答書いてないので‥‥
263 名前:デフォルトの名無しさん [2008/10/27(月) 23:38:24 ] 関数型プログラム言語触れば別に驚くことでもない
264 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:43:36 ] Firstも使うけどSingleもよく使う
265 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 03:14:06 ] >>261 最も基本の Select, SelectMany が抜けてる >>262 多分、LINQ to SQLだよな Add がどこから出てきたのか知らんが、対象がTable<T>なら データ操作にはInsert〜とかDelete〜あたりをつかう
266 名前:262 mailto:sage [2008/10/28(火) 13:58:59 ] >>265 どうもありがとうございます。>>262 のサイトからさらっと試し始めたので‥‥ InsertOnSubmitを使うんだと分りました。 たぶん、あのサイトは記述が古いんですね。 とっても面白いので、本でも買って真面目に勉強します‥‥
267 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:52:37 ] >>265 基本といえば Where もないね クエリ式で書けるものは入れてないのかな?
268 名前:デフォルトの名無しさん [2008/10/31(金) 16:20:09 ] これってORマッピングツールみたいなものか?
269 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 19:53:08 ] >>267 ラムダで書くと見た目が不必要に複雑になるからな
270 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 19:59:39 ] C#の方は XML to LINQ を無理やりC#構文で書かせるのはなんとかしてほしい。 データ操作まで無理やりオブジェクト指向にするとかえって記述がグダグダになるんだよ。 データ操作は特化した記述がいい。
271 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:27:08 ] 同じ記述でXMLが扱える所が利点なのに? わざわざ特化した記述作って、新しく覚えないといけなかったら魅力感じないな
272 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:35:02 ] もしかして関数型構築のこと?
273 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 22:23:22 ] >>269 全部クエリ式で書けない場合は,joinとかletとか使わない限りは全部拡張メソッドで俺は書いちゃうな
274 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 02:17:30 ] クエリ式みたいなものを自由に拡張できるようにして欲しいお(´・ω・`)
275 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 02:29:34 ] そんなことしたらカオスになるじゃないか
276 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 09:41:51 ] クエリ式は抽象化の度合いを下げないまま、 foreachをネストさせた時の様に変数を扱えるのが便利だね。 これを拡張可能にすると・・・関数型っぽくなる気がする。
277 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 09:50:56 ] >>275 しかしそれがいい・ >>276 調子に乗ってクエリ式つなげてくと遅くなるらしいからなぁ・・・ 記述方法は大好きなんだが。
278 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 10:45:55 ] >>277 遅くなるってのは意外と平気。 かなりバカに書かない限りはforeach書くのと比べて1割くらいしかパフォーマンス落ちない。
279 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:38:48 ] 遅延評価を繋げるだけならほとんど遅くはならないはず
280 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:49:52 ] 遅い速いは相対的なものだからどのレベルで遅いといってるのか示さないと議論にならない。 非常に細かいパフォーマンスを気にしているなら、 ラムダ式(デリゲート)を使うので関数の呼び出しがインライン化されないとか、 SumやMaxなど集計系メソッドを複数使った場合にちょっと効率の悪いことをしているとか そんなところだね。
281 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:18:38 ] Reverseってバッファ使うから即時実行だと思ってたんだけど、Reverseの呼び出し時じゃなくて 最初のMoveNextの呼び出しの時点ですべての結果が決まるから遅延実行になるのか 速い遅い気にするならどういう実装になってるか気にしないといけないね
282 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:31:55 ] 3.0出始めの時に誰かが、foreachで条件とか変換とか並べて書いたのと、クエリ式とか並べて頴田の比べて結構違いがあったような。
283 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:37:47 ] Linq to ObjectとLinq to SQLは分けないと話が食い違うから要注意。
284 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:44:36 ] この文脈でどう読んだらto SQLになるのか
285 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:50:21 ] 4.0の紹介ビデオみてるが、よいなぁこれ・・・ 来年早々にも出してくれんかな・・・
286 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 13:11:04 ] PLINQとか並列化関係いいなぁ・・
287 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:04:48 ] 4.0の紹介ビデオってmsdnにある?
288 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:12:26 ] channel9.msdn.com/pdc2008/TL16/ ちなみに、パスを1段削って、 channel9.msdn.com/pdc2008/ にするとPDCのセッションの一覧が出てくる。
289 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:31:16 ] thx
290 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:31:48 ] C#インタプリタ、すげぇ!
291 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:38:50 ] >>282 ufcpp.net/study/csharp/sp3_linqreconstruct.html#iterator これ? foreach で置き換えるだけじゃたいして性能変わらない。 ここで違いが出てるのはそれの次の節の話で、 「if をループの外に出せ」と同じ原理で 「可能な限り where を from の上に」ってやるとパフォーマンス結構変わる。
292 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:16:15 ] LINQのクエリ式とSQLの一番の違いがプランナの有無。 クエリ式は書いた順番どおりに処理していくが、 SQLはプランナが最適な実行計画を立てる。
293 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:39:15 ] LinqtoObjectも気合い入れてプロバイダ書けばプランナ相当のもの記述可能? いや書く気毛頭無いですが
294 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:26:24 ] やろうとおもえばLINQでスクリプト言語書けるよ
295 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:52:31 ] >> 294 出だしだけでもKWSK
296 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:07:42 ] LINQ to SQLって無くなるの? なんつーか、ぶちまければ良いってもんじゃねぇだろ。 そんなのはオプソ系に任せとけよ。
297 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:08:39 ] 何で無くなると思ったのさ?
298 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:35:18 ] なくなるっつーかLinq to Entityに置き換えでしょ。 別に今のところは対して書き方が違うわけじゃないし Linq to Entity完成までの代打的存在として十分用を果たしたような。
299 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 22:44:48 ] うむ。かなりの部分でSQLの開発楽にしてくれた。 ストーリーにちゃんと沿わないと痛い目あうがなwww
300 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 23:18:07 ] >>296 開発が止まるだけで今後も当面は.NET Frameworkに標準搭載が続くんじゃないの?
301 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:12:05 ] Entity Frameworkは絶対こける。 間違いない。
302 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:44:11 ] >>301 まあVer.3ぐらいになるまでは毎回大変更の嵐だろうな。
303 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:23:24 ] Entity FrameworkはLinq to SQLの問題点が色々と解決されてるんだけど デザイナが使いにくすぎる。 RailsのActiveRecordみたいに ちょこちょこっとクラスに属性を付ければモデル完成、 ってのフレームワークだったらよかったのに。
304 名前:デフォルトの名無しさん [2008/11/20(木) 12:30:10 ] LINQ to SQLってADO.NETより目茶苦茶いいな。 更新系では、生のSQL文に完全なWHERE句を入れてくれるし、 非接続型・楽観的制御(←赤間さん流)では文句なし。 あと、生SQLのサブクエリ相当の組み合わせを段階を踏んで書けるのもいい。 デバッグも迅速になりそう。
305 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 15:06:45 ] 俺、LINQ to P2P で当てたら結婚すんだ。
306 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:51:19 ] >>304 消える運命にあるが
307 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:15:10 ] なんらかの形で残るよ。使ってみれば、この方向性で進化していくんだろうと判る。 今のはちょっとSQL Serverに特化しすぎてるからディスコンかもしれないけどさ。
308 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:16:56 ] >>307 この方向性で進化した結果がLinq to Entityなんだけど、今のところいまいちの出来。
309 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:32:43 ] >>308 Entity Framework自体まだ手を付けてないのだが、どういまいち?
310 名前:デフォルトの名無しさん [2009/01/04(日) 23:25:17 ] 例えば、 Select Sum(col1),Sum(col2),Sum(col3) from Table1 なSQLだとLINQではどう書くの?
311 名前:デフォルトの名無しさん [2009/01/04(日) 23:46:52 ] >>310 そんな質問はつい最近掲示板で見た事あるな
312 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:59:48 ] これか。ググったら一発で出てきたw ttp://bbs.wankuma.com/index.cgi?mode=all&namber=30713
313 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:53:25 ] ただのマルチじゃねーかw
314 名前:デフォルトの名無しさん [2009/01/07(水) 02:50:59 ] >>311 >>312 >>313 ケチは付けられても結局答えられる奴いねぇんだな 暇なカス野郎だけかよ
315 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 03:06:42 ] var result = from item in Table1 select new {Sum1 = item.col1.Sum(), Sum2 = item.col2.Sum(), Sum3 = item.col3.Sum(), } でいいんじゃね?
316 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 04:16:09 ] いや、良くない。範囲変数itemは単なる1レコードで、item.col?はスカラー 1回のループで計算したいなら、アキュムレータ使うしかないはず var sum = Table1.Aggregate(new[] { 0, 0, 0 }, (y, x) => { y[0] += x.col1; y[1] += x.col2; y[2] += x.col3; return y; });
317 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 05:35:25 ] >>316 それはクエリプロバイダ次第じゃなかろうか。 確かにLINQ to Objectのみなら>>316 の書き方の方が速い。 しかしTable1.Aggregateのオーバーロード解決次第によっては クエリプロバイダの提供する最適なクエリ演算子ではなく LINQ to Objectの低速なパスで実行されるため>>316 はかえって遅くなる。 式木的に Select Sum(col1),Sum(col2),Sum(col3) from Table1 というSQLに対応するのが何かと聞かれれば>>315 を推したい。 あとは>>310 が何を期待して聞いたか次第かな。 LINQ to SQLでの書き方を期待していたなら>>315 でも最適化されたと思うが。
318 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:09:53 ] LINQ to SQL、生成されたSQLクエリがどんなのか見れるから試してみればいいんでは。
319 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:21:29 ] いつもながらLinq to ほにゃららを明記しないと話がこじれるな。 Linq to Entityかもしれない。
320 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:45:44 ] マルチに答えるとつけあがるからやめとけ
321 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:34:27 ] >>317 考え方はいいとして、>>315 のコードが間違っているのは無視か var sum1 = Table1.Sum(item => item.col1); var sum2 = Table1.Sum(item => item.col2); var sum3 = Table1.Sum(item => item.col3); やるならこうだろ
322 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 14:07:35 ] >>321 確かに間違ってるな。 1クエリで書こうと思うとティマイザに期待しつつこう書くしかないか。 var result = from _ in Table1 new { sum1 = Table1.Sum(item => item.col1), sum2 = Table1.Sum(item => item.col2), sum3 = Table1.Sum(item => item.col3) }).Take(1).First();
323 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 14:08:38 ] ティマイザ→オプティマイザ
324 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 19:41:18 ] >>310 初心者なりに考えてみた。 全然スマートじゃないけど勘弁してね。 var result = table.Select((t, x) => new { seq = x + 1, col1 = t.col1, col2 = t.col2 }).GroupBy(t2 => t2.seq).Select(g=>new { sum1 = g.Sum(t2=>t2.col1), sum2=g.Sum(t2=>t2.col2) });
325 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:05:19 ] var result = table.Select(t => new { col1 = t.col1, col2 = t.col2 }).GroupBy(t2 => 1).Select(g => new { sum1 = g.Sum(t2 => t2.col1), sum2 = g.Sum(t2 => t2.col2) });
326 名前:デフォルトの名無しさん [2009/02/17(火) 18:54:14 ] 初めまして、よろしくお願いいたします。 どうかアドバイスを下さい。 Visual Studio 2008を使っていて、1台の自宅PCにインストールしています。 インストールしているのは、SQLServer2005 developper edtion + VB 2008です。 この環境でC/Sアプリを作り始めました。 経緯としましては、VBアプリを作るのにVSを起動して、プロジェクトの種類でVB、テンプレートで Windowsフォームアプリケーション、をクリックして進み、プロジェクト名をjob_testにしてOKをクリックしました。 VSが起動し、左にサーバーペイン、右にデータソースペインが表示されました。 ここからが問題なのですが、データソースペインがうまく機能しないのです。 1. 「ペインの「新しいデータソースの追加」をクリック 米データソース構成ウィザードが軌道します。 2.「データソースの種類」で「データベース」を選択して「次へ」をクリックして進みます。 3.「データ接続の選択」で「・・・使用するデータ接続」で既存の接続を選択して、 ラジオボタン「はい、重要情報を接続文字列に含みます。」を選択してクリックして進みます。 4.「接続文字列をアプリケーション構成ファイルに保存しますか?」で「次へ」をクリックして進みます。 5.ここ(データベースオブジェクトの選択)でエラーが発生します。メッセージは、「データベースから 情報を取り出すときに、エラーが発生しました。MicrosohutoVisualStudio.datadesignsync. designersync.Facedsync,TableConfigManager のタイプ初期化 子が例外をスローしました」と表示され先へ進めません。 どうか解決方法を教えて下さい。 それと境い目の現象なのでDBのスレにもレスさせて頂きます。ご了承くださいませ。
327 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 07:06:29 ] >>326 マルチ乙
328 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 18:50:07 ] Microsohuto社製品なんて使うからだな
329 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 04:59:59 ] >Microsohuto社 中国のばったものの会社?
330 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 21:28:41 ] 株式会社精密工具
331 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 00:42:52 ] Linq to Xmlでちょっと質問 <root> <data> <ID>1</ID> </data> <data> <ID>3</ID> </data> <data> <ID>4</ID> </data> </root> というのを <root> <data> <ID>1</ID> </data> <data> <ID>2</ID> </data> <data> <ID>3</ID> </data> </root> に変換するにはどうすれば良いんでしょうか? イメージとしては、IDを指定して<data>ごと削除、でもIDの値は1から順番になるように保つ、という感じです
332 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 00:53:41 ] データが何個あるか調べて、XMLを作り直したほうが早いと思わんかね?
333 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 02:38:35 ] いまひとつイメージがつかめないから、こうゆう解釈で行くよ〜 <data><ID>1</ID><ext at=""true"">hoge1</ext></data> <data><ID>2</ID><ext at=""false"">hoge2</ext></data> <data><ID>3</ID><ext at=""true"">hoge3</ext></data> <data><ID>4</ID><ext at=""false"">hoge4</ext></data> ID=3の行を削除でIDが繰り上がる <data><ID>1</ID><ext at=""true"">hoge1</ext></data> <data><ID>2</ID><ext at=""false"">hoge2</ext></data> <data><ID>3</ID><ext at=""false"">hoge4</ext></data>
334 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 02:42:54 ] string xml = @"<root> <data><ID>1</ID><ext at=""true"">hoge1</ext></data> <data><ID>2</ID><ext at=""false"">hoge2</ext></data> <data><ID>3</ID><ext at=""true"">hoge3</ext></data> <data><ID>4</ID><ext at=""false"">hoge4</ext></data></root>"; var doc = XDocument.Parse(xml); var rs = doc.Elements("root").Elements("data").Where(x => x.Element("ID").Value != "3") .Select((x, cnt) => { var nx = new XElement(x); nx.Element("ID").Value = (cnt+1).ToString(); return nx;} ); var el2 = new XElement("root2"); foreach (var s in rs) el2.Add(s); var doc2 = new XDocument(el2); Console.WriteLine(doc2); 今回は読み込んだXdocumentをいじらないようにしたが、いじっていいなら Linqは使わず最初に読み込んだXDocumentを直接変更してもいいと思う。