1 名前:デフォルトの名無しさん [2008/02/09(土) 23:51:34 ] VisualStudio2008より追加された便利で強力な機能 統合言語クエリ (LINQ : Language Integrated Query) ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。 関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。 DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する 言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。 質問、便利なマイテクニックの発表、いろいろやっちゃってください。
413 名前:407 mailto:sage [2009/07/16(木) 17:27:01 ] >>410 > Count() > 0とかやっちゃってる人 ……、ごめんなさい。私です。 >>411 それ、自分はC++から来たからForEachって名前にしたい、特に後者。
414 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 17:42:57 ] List<T>との整合性を考えても、ForEachの方がしっくりくるな
415 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 19:36:16 ] >>413 Count使うと最後まで読まないといけないからパフォーマンスが悪いはず Anyは一件あるかないかだから速いはず
416 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 01:05:17 ] ttp://www.infoq.com/jp/news/2009/07/Reactive-Framework-LINQ-Events
417 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 18:41:51 ] ヌルポ
418 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 19:39:22 ] LINQと例外処理ってどうやって組み合わせている? IEnumerableを参照する全ての場所で例外が起こるかもしれない、 となると例外安全の確保をしなきゃならない範囲が滅茶苦茶広くなるし、 任意のtry-catchで捕まえることもできない。 自分は「LINQ中に例外を外に投げる処理は入れるな」で対応している。
419 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 23:31:27 ] LINQからIEnum処理するところすべてtry-catch(´・ω・`)
420 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 00:16:47 ] それは、不毛過ぎるw
421 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 20:55:08 ] 配列の要素を2個ずつ処理したいときにはどうすればいいでしょうか? ruby の each_slice みたいなのがやりたいのですが。
422 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 21:12:59 ] static IEnumerable<IEnumerable<TSource>> Slice<TSource>(this IEnumerable<TSource> source, int n) { var buf = new TSource[n]; int i = 0; foreach (var item in source) { buf[i++] = item; if (i == n) { i = 0; yield return buf; } } if (i != 0) { yield return buf.Take(i); } }
423 名前:421 mailto:sage [2009/09/15(火) 15:00:48 ] >>422 ありがとう。
424 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 21:59:43 ] LINQらしさを追求してみた source.Select((x, i) => new { Key = i / n, Element = x }) .GroupBy(x => x.Key, x => x.Element) .Cast<IEnumerable<TSource>>();
425 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 06:48:18 ] まあどっちでもいいんじゃない? 拡張メソッドはガンガン使うべきなのかは迷うところ。
426 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 21:47:09 ] イベントをLINQっぽく操れるリアクティブフレームワークってのを最近知ってからというもの .NET4.0とラブプラスのことで頭が一杯です。
427 名前:422 mailto:sage [2009/09/17(木) 11:04:44 ] 今更だけど>>422 は使われ方によっては問題があるかも static IEnumerable<IEnumerable<TSource>> Slice<TSource>(this IEnumerable<TSource> source, int n) { var buf = source.ToArray(); for (int i = 0; i < buf.Length; i += n) yield return buf.Skip(i).Take(n); } メモリは食うけどこっちの方が確実
428 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 11:22:16 ] いやSkipやTake使ったらbufの意味がないな こんなの用意して代わりに使うか static IEnumerable<TSource> SkipTake<TSource>(TSource[] source, int skip, int take) { for (int i = 0; i < take; i++) yield return source[i + skip]; }
429 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 17:10:47 ] 次はforをForEach()にするんですね
430 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 19:00:29 ] 427のはあまり良くないと思う。 422のyield return bufを yield return buf.ToArray()に変えるだけで良いかと。 あと最後はbuf.Take(i)でいいかな。
431 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 19:07:12 ] sourceがIList<TSource>を実装しているか否かで場合分けするのが効率的か
432 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:20:03 ] 条件に合うものと合わないものを分けるために、 bar = foo.Select(i=>Baz(i) ); foo = foo.Select(i=>!Baz(i)); みたいに2回Selectしてるんですが、 1回で済む方法ないですか?
433 名前:432 mailto:sage [2009/09/27(日) 19:23:15 ] 間違いました。 where を2回です。
434 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:24:56 ] 欲しいのはどっちなの? 両方ほしいなら2回しないといけないと思うけど。 やりたいことが見えない。
435 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:37:47 ] 両方欲しい場合、自前でループを廻せばワンパスで振り分けできるけど、 Linqで同じようにできないか、っていう質問だろうね。 気持ちは分かるけど多分できないんだろうなあ。 Linqの想定用途はあくまで選択や射影の簡略化だろうし、振り分け処理で 無理矢理Linq使う必要無いんじゃない?と思う。foreachでいいじゃん。
436 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:49:14 ] そういうメソッドを自作すればいい。 IEnumerable<T>受け取ってTuple<IEnumerable<T>, IEnumearble<T>>でもを返すようにしてさ。
437 名前:432 mailto:sage [2009/09/27(日) 19:58:37 ] 優先度のある条件を集合に適用する処理を 以下のように書きました。 foreach(var 条件 in 条件リスト){ var マッチしたもの = 集合.Where(条件) 集合 = 集合.Where(!条件) (マッチしたものに対する処理) } というループを書いていたのですが、 ruby の partition メソッドみたいなのがあれば 一回ですむじゃん。 と思ったのですが、ヘルプをみてもわからず、 ググってもわからず、なので質問させていただきました。 処理が重いので1パスにしたいというわけではないので、 2回 Where するままにしておきます。 レスありがとうございました。
438 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:11:24 ] やりたいのはこういうこと? Func<int, bool> cond = x => x % 2 == 0; var q = from x in new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, } let b = cond(x) group x by b; var even = q.First(x => x.Key); var odd = q.First(x => !x.Key);
439 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:04:04 ] だね。 ruby の partition メソッドはズバりGroupBy。 ToLookupはその即時評価版。
440 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 02:41:06 ] ToLookupなんてあるんだな。 おもしろそうだからこれを使ってFizzBuzzをといてみた。 var nums = Enumerable.Range(1, 100); var fizzbuzz = nums.ToLookup(num => (num % 15 == 0 ? "fizzBuzz" : (num % 5 == 0 ? "Buzz" : (num % 3 == 0 ? "fizz" : "Other"))), arg => arg); foreach (var group in fizzbuzz) { Console.WriteLine("*****" + group.Key + "*****"); foreach (var num in group) Console.WriteLine(num.ToString()); }
441 名前:デフォルトの名無しさん [2009/10/10(土) 19:43:10 ] プログラミングC#でLINQの項目をちょっと読んでみたが、 C#のコード中に普通にselectとかfromとか書くのは違和感あるなぁ。 C#の予約語になってんのかね?
442 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:44:40 ] >>441 文脈キーワード
443 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 12:02:58 ] LINQって別に最適プランとか計算しないんでしょ? ほんのちょっと前までデータベースからデータを「SELECT * FROM TABLE」で持ってきて コード内でデータの取捨を行うなんて、やっちゃだめの最右翼だったのに、すんげえ 富豪的プログラミングだなあ…。
444 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 12:30:06 ] WHERE句はあるには有るけど 内部で式評価を最適化しているわけではない
445 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 12:54:50 ] Linq to Objectにはプランナはない。命令の順番で処理される。 Linq to SQLやEntity Frameworkの場合はDBMSのSQLに翻訳されるから、 DBMSのプランナが機能する。
446 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 19:08:08 ] LINQ to SQLって、要するに式ツリーからSQLを生成するORMという理解でOK?
447 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 19:17:58 ] LINQ to SQLの中身がわかってない奴が多いのな。 とりあえずDataContext.Logで吐かれるSQLを確認するところから はじめたらどうだ?
448 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:29:13 ] ですな。 >>443 のような酷い勘違いは初めて見たけど。
449 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:40:37 ] LINQ to Objectsを最適化するとしたら,DynamicMethodでインライン展開かなあ コード生成のコストが高いからあんまり意味なさそう
450 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:37:17 ] >>446 Whereの条件とかは式ツリーだけど、Where自体は式ツリーでない >>447-448 まあ、LINQ to SQLで生成されるSQLも大概だがな 作成したクエリ(IQueryable)をそのまま変換してるからサブクエリが深すぎて何が何やら
451 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 23:25:35 ] >>446 そう。ただ実行の度に発行される。ToList()すりゃ1回ですむけども。
452 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 18:34:12 ] /) ///) ノ´⌒`ヽ /,.=゛''"/γ⌒´ \ / i f ,.r='"-‐'つ ""´ ⌒\ ) / / _,.-‐'~ \ / i ) こまけぇことはいいんだよ!! / ,i ,二ニ⊃ (・ )` ´( ・) i,/ / ノ il゛フl (__人_). | ,イ「ト、 ,!,! \ `ー' / / iトヾヽ_/ィ" `7 〈
453 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 12:28:38 ] データは作成する回数よりも参照される回数の方が多いわけで、 キャッシュがないから遅延されても重くなるだけじゃないか? 結局はToList()しまくるハメになっている気がする。
454 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 13:04:29 ] SQLはちゃらっと書く分には楽だな。 最適化とか考えてくとだんだんめんどくさくなりそうだけど。 つーかいい加減データアクセスモデルはナイスな奴一つにまとめてくれ。 Oslo?
455 名前:デフォルトの名無しさん [2009/11/07(土) 19:58:09 ] 確かにMSは昔からデータアクセスの新方式を乱発しすぎなんだよな。
456 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 14:02:34 ] 遅延評価も即時評価も都合に合わせて選択できるってことで 今のモデルで悪くないと思うがな。 そもそも本当にチューニングが必要な場所ならLinqは使わないだろ。 性能云々うるさいやつ向けに..Optimize()あたりを追加してみるか?
457 名前:デフォルトの名無しさん [2009/11/09(月) 17:37:01 ] 手段がいろいろ用意されて軽く破綻してるC++の二の舞ですね パラダイムを混ぜこぜにするとよく起こる
458 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 17:39:44 ] 結局のところ記述性と性能はトレードオフなんだよ
459 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 00:55:32 ] え、いや、Linq の遅延評価は記述性って言うか スケーラビリティ?だべ。要素数がドカーンって なっても使えるという意味での。
460 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 02:05:16 ] SelectMany の戻り値に一つだけ要素を足したいです。 今は、 var list = new List<T>(); list.Add(item); list.AddRange(foo.SelectMany(i => bar(i))); のように書いてますが、なんか 冗長な気がします。 1個要素を足すためだけに List のインスタンスを 生成するのは無駄な気がするんですが、 避ける方法ないでしょうか?
461 名前:460 mailto:sage [2009/11/15(日) 02:16:19 ] すまん、Concat を見つけた。 foo.SelectMany(i=>bar(i)).Concat(new[]{ item }); と書けた。 でも、配列生成してんのが無駄な気がするが、 回避する方法ないよね? ( new List<T>(){ item } とかは無しでw)
462 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 03:02:15 ] () => { yield return item; }
463 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 10:18:15 ] ラムダ内をイテレーターブロックにはできないよ。 やるなら、拡張メソッド追加して、 public static IEnumerable<T> Concat(this T x, IEnumerable<T> list) { yield return x; foreach(var i in list) yield return i; } public static IEnumerable<T> Concat(this IEnumerable<T> list, T x) { foreach(var i in list) yield return i; yield return x; }
464 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 11:46:45 ] >>461 Enumerable.Repeat(item, 1) で回避。
465 名前:デフォルトの名無しさん [2009/11/15(日) 12:01:40 ] 拡張メソッドにT使えたっけ?
466 名前:デフォルトの名無しさん [2009/11/15(日) 12:17:35 ] Concat<T>が正解ね
467 名前:デフォルトの名無しさん mailto:sage [2009/11/15(日) 16:28:58 ] >>464 それたぶん配列作った方が効率的 Rangeで作られるイテレータよりも配列のイテレータの方がずっと速いはず
468 名前:467 mailto:sage [2009/11/15(日) 16:30:40 ] 間違えたRepeatか
469 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:11:22 ] Linq to Object で List 内のデータを取り出した時に、そのデータを変更することはできるのでしょうか? Linq to Object では、抽出するだけなのでしょうか?
470 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:17:14 ] >>469 List 自体の更新? LINQ 以前に、GetEnumerator で列挙してる最中にリストのアップデートかけちゃダメ。 list[i] = xxx; 的なことがしたいって場合も、GetEnumerator じゃ無理。 list[i].Property = xxx; 的なことなら、 foreach (var x in list.Select(xxx)) x.Property = xxx; で可能。
471 名前:469 mailto:sage [2009/12/11(金) 23:15:10 ] >>470 ありがとうございます。 LINQ は便利だなぁと(ソートもしてくれるし), PLINQ にもなるし; 抽出した内容を判別して、データを変更できるんだろうなぁと思っていました。
472 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 14:18:30 ] ちなみに、標準では Foreach メソッドみたいなのないけど、 それを認めると LINQ 中で副作用起こすのを推奨しちゃうことになるから避けたらしい。 list.Select(x => xxx).Foreach(x => x.Property = xxx); みたいなのは邪道。 LINQ 中では副作用は起こさないこと推奨。
473 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 14:47:28 ] なれていない人って偶に int count = 0; var distList = from i in srcList select new { Val=i, Index=++count }; みたいな事をやっちゃうよねw そういうノウハウってどこかにまとまっていないのだろうか? MSDNにLINQの使い方ガイドラインってないよね?
474 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 15:48:41 ] 外部スコープの変数を書き換えるといろいろ副作用が怖いね。 よほど理解して使わないと。
475 名前:デフォルトの名無しさん [2009/12/12(土) 18:32:10 ] 副作用?そんな表現はじめて聞いた。 msが言ってるの?
476 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 18:45:02 ] 一般的な言葉じゃないか? 「ifの中に副作用のある式を書くな」なんて昔から言われているし
477 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 18:50:51 ] Linqというよりそこで使われてる静的クロージャの問題。 .NET2.0でクロージャが実装されたとき有名になったプログラム。 i, j がどんな値になるか想像つく? using System; using System.Collections.Generic; delegate void F(); class Test { static void Main() { List<F> actionList = new List<F>(); for(int i = 0; i < 10; ++i) { int j = i; actionList.Add(delegate(){Console.WriteLine("i={0}, j={1}",i, j);}); } foreach (F f in actionList) f(); } }
478 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 20:20:23 ] LINQの副作用関連でのエンバグは、>>477 以外に遅延評価に原因しているものもあると思う 標準的な使い方である「LINQ中でselect new」すら副作用のある式なわけで (戻り値を使う場所も含め)ちゃんとその挙動まで把握しないと不味い。 var hoges = from p in hoge select new Hoge(p); foreach(var hoge in hoges) { hoge.ValueChanged += Hoge_OnValueChanged(); } foreach(var hoge in hoges) { hoge.Value = 3; } // Hoge_OnValueChanged………? そこまで考慮している保証のないクラスや関数に 値を渡す/返す場合は常にToArray/ToListするのが正解か
479 名前:デフォルトの名無しさん [2009/12/13(日) 03:24:35 ] そりゃそうだろw 何言ってんのw
480 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 03:41:07 ] >477 のは気をつけないと忘れてて、あれうごかねぇとかたまにやるw最近は体が覚えてきたが。 >478 うちのバカエンジニアとかでもおなじようなことしてそうでこえぇ。
481 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 19:31:28 ] >>479 自分一人ならこういうノウハウもすぐに納得して「そりゃそうだ」で済ませれるが、 仕事でチームでやっていると全員がLINQを理解しているわけじゃないから、そうもいかないのよね。 気がつくと新人がコメントに「//なぜかこのToListを外すとぬるぽ」とか書いてたりするw
482 名前:デフォルトの名無しさん [2009/12/14(月) 13:13:04 ] そんなこと言ってたら新しいことなんもできんやろ 未熟な人間にあわせてどうすんねんw
483 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 17:16:24 ] まともな業務アプリの開発だと、LINQでDBアクセスなんてしないから(つーか、したらバカ) そんなに大して問題にはならない。 クライアントサイドでリスト形式の一時データを参照をする場合になら使える程度だと思う。
484 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 17:30:49 ] そうは言ってもLinqなしでEntityFrameworkを使うのはつらいぞ(笑 自分の理解できないものを嫌う気持ちもわからんではないがね。 そういう人はLinq以前にORMも使えないのだろう。
485 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 22:08:07 ] >>482 新しい技術を導入したらアホがアホなことをしないように、 実装規約やガイドラインを用意しなきゃならんのよ。辛いことに。
486 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 06:45:06 ] LINQ漬けになるとトランザクションを意識しない楽観的な思考になりやすい。 そしてDB更新系で落とし穴に。。。
487 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:32:42 ] TransactionScope 使えるんだし大丈夫じゃね?
488 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:13:23 ] ・意味不明な所で例外が起こってトラブったら、LINQの遅延評価が原因だったでござる。 ・想定外の値が返ってくると思ったら、LINQの遅延評価+キャプチャが原因だったでござる。 ・新人が遅延評価+ソースの値の変更を前提としたコードを作っていたでござる コードの各所に見えない依存関係ができてもうやだ… 自分のコードは副作用のないようにしているが、他人のコードはどこまで追っかけても分からん…
489 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 01:16:01 ] .Selectで検索して全部ToList()すれば?w
490 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 01:49:49 ] 遅延評価前提ってのは別にいいんじゃないの? 後段に更に条件を繋げられるようになるのだから、指針としては悪くない。 キャプチャのほうは本当に注意深くやらなきゃいけないのに、無頓着な人いるよね……
491 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 10:37:33 ] チーム規約で、ToList 必須にしちまえば?
492 名前:デフォルトの名無しさん [2010/01/16(土) 10:40:55 ] キャプチャってどういう意味? わからないから聞いちゃう><
493 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:50:19 ] 頼み方が悪いから教えない
494 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:50:23 ] クロージャで外のローカル変数を取り込むやつかな それを利用して長く状態持たせたりすると凶悪
495 名前:デフォルトの名無しさん [2010/01/16(土) 14:55:39 ] それでもGCがなんとかしてくれるんでしょ? もしかしてunsafeがらみの話?
496 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 15:05:45 ] そういう話じゃなくてさ int i = 0; otherClass.Items = source..Where(x=>x.Value == i++); こんなことされるともうどうなるか分からないだろ OtherClassのItemsの評価回数に依存することになる
497 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 21:53:13 ] >>496 いいたいことはわかるが動くコードかこうな。 説得力ないから。
498 名前:デフォルトの名無しさん mailto:age [2010/02/04(木) 18:12:53 ] すみません、質問です。 LINQには、バージョンはあるのでしょうか? VS等のバージョンはどんどんとあがっていっていますが、 コードが同じもので動かなくなるかどうかを知りたいです。 例えば、CLRに完全依存の構造なので、CLRバージョンが変わる時に 注意が必要、など
499 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 20:54:49 ] 基本的に上位互換だから気にしなくていい
500 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 13:27:50 ] すみません、質問です。 LINQで更新や削除は行えるのでしょうか? たとえ行えたとしても、細かい制御が出来ないからADO.NETで ExecuteNonQuery使った方が楽っていう結論になってたりするのかな?
501 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 13:29:30 ] Linq to SQL Linq to Entity 両方ともORMだから可能。
502 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 13:52:18 ] いったんエンティティに読み込むから大域処理には向いてないな。
503 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 19:05:38 ] 一括更新用の拡張メソッドを作っている人達もいるな。
504 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 19:26:15 ] テーブルは第3正規化がされているのが普通だし、多数の表の集合演算が入るから 結局はエンティティと対になるストアドプロシージャを組んでしまう。LINQ気持ち悪い。
505 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 21:36:19 ] LINQは排他制御がきちい
506 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:03:06 ] L2Sは更新がちょっとという人は、DataContext.GetCommand(query).CommandTextで取得した WHERE句を元にUPDATE句やDELETE句を組み立てて、DataContext.ExecuteCommand()を実行する ような拡張メソッドを用意するのが良いと思うよ。 そうすれば、更新処理はADO.NETを使ってベタでとかやらずに、トランザクションや排他に ついてはExecuteNonQueryと同じ考え方で設計出来るから。 っで、それ以上の事をやりたくなったらストアドで。
507 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 01:17:13 ] >>506 結局はSQLを書くってこと?LINQの意味なくない?
508 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 06:55:49 ] この辺を参考に。 ttp://weblogs.asp.net/jeffreyzhao/archive/2008/03/06/linq-to-sql-extension-batch-deletion-by-lambda-expression.aspx ttp://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
509 名前:デフォルトの名無しさん [2010/02/13(土) 17:28:02 ] Distinct重複は取り除けるけど、重複しているものだけを 取り出すには、どうすればいい
510 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:48:11 ] groupbyしてwhere count>2って感じ。
511 名前:デフォルトの名無しさん [2010/02/13(土) 18:48:06 ] >>510 サンクス int[] numbers = { 5, 4, 1, 3, 9, 5, 8, 4, 6, 7, 2, 5, 0 }; var Nums = numbers.GroupBy(num => num).Where(num => num.Count() >= 2); foreach (var x in Nums) Console.WriteLine("{0}:{1}",x.Key,x.Count());
512 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 19:27:29 ] そこらへんはLINQというよりSQLのセンスだよな。
513 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:55:57 ] LINQ 初めて使ってみたけどなんか面白いね ていうか拡張メソッドが面白いのか