![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_13.png?e8efa67)
ある年月に一番近い大きな日付を1件取得したいと思っています。
ある年月は40000件くらいあります。
一番早く実行できる方法を探しています。
対象となるデータを全部DataTableに取得し
LINQで何度も検索するのがいいのかと思いつきました。
全部取得するときに年月を降順に指定すると
Dim datarecord = (From animal In tbData Where animal.Field(Of Date)("年月") <= ある年月 Select animal).First
で一番近い大きな年月が取得できることが保証されるのでしょうか?
それともSQLでは何も指定せずLINQで順番を指定するのが早いのでしょうか?
No.1ベストアンサー
- 回答日時:
LINQは基本的には遅延評価にメリットを求めたほうがよいと思います。
速度的には列挙体を検索するのとあまり変わらないです。
DataTableにはSelectメソッドがありますことらを利用すればよいのではないでしょうか?
まずLINQより早いです。
http://www.yel.m-net.ne.jp/~oss/Tips/ADO/Tips_01 …
この回答への補足
ありがとうございます。
やってみましたがLINQの方が早く処理が終わりました。
'DataTableにSelect
Do Until getCalcDate < minCalcDate
'Dim datarecord = tbData.Select("年月<=#" & getCalcDate & "#", "年月 DESC")
'取得した1行目の合計を計算
XXXXXXXX
'次の検索する年月の作成
getCalcDate = DateAdd(DateInterval.Minute, 1, getCalcDate)
Loop
'LINQで検索
Do Until getCalcDate < minCalcDate
Dim datarecord = (From animal In tbData Where animal.Field(Of Date)("年月") <= getCalcDate Order By animal.Field(Of Date)("年月") Descending Select animal).First
'取得した1行目の合計を計算
XXXXXXXX
'次の検索する年月の作成
getCalcDate = DateAdd(DateInterval.Minute, 1, getCalcDate)
Loop
LINQをDo Uintilの外に出すと
結果が間違って返ってきます。
No.3
- 回答日時:
Dim datarecord = (From animal In dt Where animal.Field(Of Date)("年月") <= getCalcDate And animal.Field(Of Date)("年月") >= minCalcDate Order By animal.Field(Of Date)("年月") Descending Select animal)
For Each field In datarecord
Console.WriteLine(field("年月"))
Next
ではどうでしょうか?
試してみましたが効果が得られませんでした。
SQLを何回も発行するほうが何倍も早かったので
LINQはあきらめました。
環境と作り方によって変わるので
合っているものを選んでいこうと思います。
何度もお返事ありがとうございました。
No.2
- 回答日時:
提示していただいたソースであれば、LINQのほうがダントツで早いです、なぜかというと、抽出が実行されていないからです。
LINQは遅延評価を行います、結果を参照されてたときに始めてクエリが実行される仕組みです。
そのため、
XXXXXXX
となっている部分を、何か参照するロジックに変更してください。
3回くらい参照するようにすれば、その差は歴然です。
これを解決する方法は、
datarecord.ToList<>などの変換メソッドのどれかを利用しコピーを作成してからアクセスするようにします。
話を戻します。
LINQは遅延評価ですので、参照されるたびに条件式で評価しなおします。
そのため、そのときのDataTableの内容を評価した結果を返してきます。
条件によっては参照するたびに違った結果を出すことも可能というわけです。
この回答への補足
早そうな遅延評価を実行させるように
プログラムを書き換えました。
でもうまくできませんでした。
「シーケンスに要素が含まれていません」
が表示されます。
Dim getDate As Date 'ある年月
Dim tbData As DataTable 'データ
Dim total as Decimal '合計値
tbData にテーブルデータ取得
Dim datarecord = (From animal In tbData Where animal.Field(Of Date)("年月") <= getCalcDate Order By animal.Field(Of Date)("年月") Descending Select animal).First
'対象年月分ループ
Do Until getCalcDate < 最小日付
total +=datarecord("データ")
getCalcDate = (getCalcDate を減らす式)
Loop
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
count(*)で取得した値をJAVAの...
-
Spreadの選択行の取得について
-
VBAでステータスバーの情報取得...
-
LAN内接続マシン数及びIP、マシ...
-
VBA:小数点以下の数字を取得で...
-
指定のURLのタイトルを取得...
-
VBA Shapesの座標からセル位置...
-
利用者側のMACアドレスを取得し...
-
リストビュー:先頭行のアイテ...
-
DOS窓の非表示
-
like演算子内に変数って使えな...
-
JavaScriptでリンク先やリモー...
-
VBAでActiveDirectoryのユーザ...
-
Struts2 <s:select>タグの値取...
-
LINQで取得したときの順序
-
EXCELのリストボックスを選択し...
-
VB .netにて現在時刻+1時間後...
-
JavaScriptでWindowsログオンID...
-
ListViewの項目を入れ替える
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
count(*)で取得した値をJAVAの...
-
VBAでActiveDirectoryのユーザ...
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
データ数をカウントしたいのですが
-
Spreadの選択行の取得について
-
利用者側のMACアドレスを取得し...
-
JavaScriptにおいてコンピュー...
-
Flexgridで選択行の列の値を取...
-
VBA Shapesの座標からセル位置...
-
like演算子内に変数って使えな...
-
JavaScriptでWindowsログオンID...
-
IFRAME内のURLを取得したです。
-
ListViewで複数選択された項目...
-
Google Apps Script で、Web上...
-
URIでのページの移動について
-
NTPサーバから時刻を取得する
-
「Excel VBA」 Webクエリ マク...
-
VB .netにて現在時刻+1時間後...
おすすめ情報