• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LINQで取得したときの順序)

LINQで取得したときの順序

このQ&Aのポイント
  • LINQを使用して、ある年月に一番近い大きな日付を1件取得する方法を探しています。
  • データをDataTableに全て取得し、LINQで検索する方法を考えています。
  • 年月を降順に指定することで、一番近い大きな年月を取得することができるかどうか確認したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

LINQは基本的には遅延評価にメリットを求めたほうがよいと思います。 速度的には列挙体を検索するのとあまり変わらないです。 DataTableにはSelectメソッドがありますことらを利用すればよいのではないでしょうか? まずLINQより早いです。 http://www.yel.m-net.ne.jp/~oss/Tips/ADO/Tips_01007.htm

taku_pon
質問者

補足

ありがとうございます。 やってみましたが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の外に出すと 結果が間違って返ってきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答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 ではどうでしょうか?

taku_pon
質問者

お礼

試してみましたが効果が得られませんでした。 SQLを何回も発行するほうが何倍も早かったので LINQはあきらめました。 環境と作り方によって変わるので 合っているものを選んでいこうと思います。 何度もお返事ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

提示していただいたソースであれば、LINQのほうがダントツで早いです、なぜかというと、抽出が実行されていないからです。 LINQは遅延評価を行います、結果を参照されてたときに始めてクエリが実行される仕組みです。 そのため、 XXXXXXX となっている部分を、何か参照するロジックに変更してください。 3回くらい参照するようにすれば、その差は歴然です。 これを解決する方法は、 datarecord.ToList<>などの変換メソッドのどれかを利用しコピーを作成してからアクセスするようにします。 話を戻します。 LINQは遅延評価ですので、参照されるたびに条件式で評価しなおします。 そのため、そのときのDataTableの内容を評価した結果を返してきます。 条件によっては参照するたびに違った結果を出すことも可能というわけです。

taku_pon
質問者

補足

早そうな遅延評価を実行させるように プログラムを書き換えました。 でもうまくできませんでした。 「シーケンスに要素が含まれていません」 が表示されます。 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

  • DataTableの件数を取得したい

    DataTableの件数を取得したいのですがどのようにすれば取得できますか? Private Function getDataListCnt() As Long Dim DBConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("xxx").ConnectionString) Dim sqlCmd As New SqlCommand sqlCmd.Connection = DBConnection Dim lngRet AS Long Dim dt As DataTable = New DataTable() dt = GetList() ☆ここで取得したい☆ lngRet=??? Return lngRet End Function Private Function GetList() Dim CmdTxt As StringBuilder = New StringBuilder() CmdTxt.AppendLine(" SELECT * FROM TBL WHERE CD='001'") Dim dt = GetDBListData(CmdTxt.ToString()) Return dt End Function

  • C# LINQ 継承クラスに射影充填したい

    LINQ for SQLで、DBDataContextにて以下のクラスが自動宣言されています。 public class Job {   public ID { get; set; }   その他大量のフィールドプロパティ(100個くらい) } で、これを継承する以下のクラスがあります。 public class JobE : Job {   いくつかのプロパティ(100個くらい) } LINQ for SQLで、JobEインスタンスに充填したいです。 JobEで追加されたプロパティはすべて初期値でOKです。 using (var context = new DBDataContext()) {   var jobE = context.Jobs     .Where(j => j.xxx == yyy)     .Select(j => new JobE {       現状はここに延々とプロパティを書き連ねています。       (JobE側のプロパティ = Job側のプロパティ)     }); } あまりに馬鹿げていると思います。 もう少し賢い方法はないでしょうか?

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • T-SQL(1件のみの取得)(再度)

    前回、-SQL(SQL Server2000)で対象データを一件のみ取得する場合、どのようにすれば良いでしょうか? 処理的に無理でしょうか? PL/SQLの"ROWNUMBER = 1"のような条件は使うことが出来ないのでしょうか? 上記の内容の質問をさせて頂いて、『TOP』が使用できるという回答をもらったのですが、この『TOP』は、SELECT文で取得しようとする場合 どのようにすれば良いでしょうか? ヘルプ等で調べてみたものの、良く理解できませんでした;; 取得内容としては、該当データ1レコード内の1フィールドを取得したいです。 /* PL/SQLから引用 */ SELECT 項目A   FROM テーブルA WHERE 項目A = 'AAA' AND 項目B = 10 AND ROWNUMBER = 1 この様な、取得方法を使用したいのですが、T-SQLではどのように行えばよろしいでしょうか? また、別の方法がありましたらお教えください。。。

  • VB.NETでDataTableにデータ追加したい

    VisualStugio.Net2003でソースコードを記述しており、コード内でSQLのSELECT文を実行して、実行結果をDataTableに格納する処理をしています。 今回、とあるテーブルに対し2パターンのSQLを実行し、それぞれの実行結果を1つのDataTableに格納したいのですが、どのようにすれば良いでしょうか? 自分で調べたところ、先に実行したSQL結果に、後から実行したSQL結果を1行ずつ追加するといった方法は見つかりましたが、1行ずつではなく、一括で追加する方法が知りたいです。 前提として、2回のSQL実行では、同じテーブルの同じ項目をSELECTしております。 下記に簡単ですがコード記述の概要を補足しておきます。 ・コード記述概要 【変数宣言】 Dim DB1 As DataTable Dim DB2 As DataTable 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 【DB1にDB2のデータを追加】←ここのやり方を知りたいです DB1 = DB1 + DB2 よろしくお願いいたします。

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • オラクル+SQL Plus

    SELECT A FROM AAA WHERE ROWNUM<=5とSQLを実行すると 必ず5つ返ってくるとは限らないみたいで… テーブル名やフィールド名が分かっている状態で 何万件ものデータベースから指定した個数だけ返ってくるような SQL文があるのであれば教えてください。 個数さえ合っていれば順番は特に気にしません。 よろしくお願いします。

  • 前月の取得について

    テーブルAには、年月、単価と言うカラムを持っており、 データとしては、下記のように保持しております。 2011/01/01 100 2011/02/01 200 2011/03/01 300 2011/04/01 400 データを取得する際にWHERE句に「2011/02/01」と指定した場合に 「2011/02/01」を当月とし、 「2011/01/01」を前月として取得、 「2011/02/01」の単価と「2011/01/01」の単価を差分として取得したいのですが、 サブクエリだと複数のデータがあるため、エラーで落ちてしまいます。 何か良い取得方法があればご教授頂けないでしょうか。 SELECT 単価 as 当月, (例:200) 単価 as 前月, (例:100) 単価 as 差分 (例:100) FROM テーブルA WHERE 年月='2011/02/01' 以上、よろしくお願い致します。

  • 抽出結果を分割して取得

    SELECT * FROM TABLE ORDER BY A; で取得したデータが100件あったとして、 1件目から20件目だけを取得する 21件目から40件目だけを取得する みたいに、件数を指定して取得するようなSQL文は書くことができますか? データベースはOracle8iです。 よろしくお願いします。

  • 【ASP.NET】MySQLのテーブルレコードの検索結果について

    お世話になります。ASP.NETおよびMySQLに関する質問です。 現在、ASP.NETで開発をおこなっております。 データベースにはMySQLを使用しており、以下の内容でSELECT文を 発行してテーブルレコードを取得しております。 ------------------------------------------------------ Private Function fcSelect_Table As DataTable Dim dt As New DataTable 'DB接続文字列の設定 Dim connectionString As String connectionString = "server=localhost;database=db01;user id=xxx; password=xxx;" 'DB接続 Dim _Connection As New MySqlConnection(connectionString) _Connection.Open() Dim cmd As MySqlCommand = _Connection.CreateCommand() Dim dr As MySqlDataReader = Nothing Try 'SQL文の作成 sql.Length = 0 'SELECT sql.Append(" SELECT " & vbCrLf) sql.Append(" ,AFFI_CODE " & vbCrLf) sql.Append(" ,REGIST_NUM " & vbCrLf) sql.Append(" ,KIND " & vbCrLf) 'FROM sql.Append(" FROM TBL_TEST " & vbCrLf) 'WHERE sql.Append(" WHERE " & vbCrLf) sql.Append(" AND AFFI_CODE = '" & Trim(tfx_所属.Text) & "'" & vbCrLf) sql.Append(" AND REGIST_NUM = '" & Trim(tfn_登録番号.Text) & "'" & vbCrLf) sql.Append(" AND KIND = '" & DropDownList_種別.SelectedIndex & "'" & vbCrLf) 'MySQLCommand作成 cmd.CommandText = sql.ToString 'SQL文実行 dr = cmd.ExecuteReader()       // 正常処理されることを確認済 // ここにDataTable型オブジェクトdt にdrの内容を格納する処理が必要? Catch ex As Exception End Try Return dt End Function ------------------------------------------------------ 上記で取得した結果をDataTableに格納し、それを画面に表示させたいのですが、DataTableへの格納方法がわかりません。 どなたかご教授いただけないでしょうか?