[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 04/23 21:13 / Filesize : 117 KB / Number-of Response : 335
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2008/02/09(土) 23:51:34 ]
VisualStudio2008より追加された便利で強力な機能

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

ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。


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を直接変更してもいいと思う。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<117KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef