VB2017.Netで、DataTableでLINQを使いたいと考えています。
仮に、下記のコードを実行すると、メッセージボックスに山田と表示されます。
(質問1)
フォームにTextBoxを置いて、TextBoxの入力内容に従って、”1944”と”1959”を切り替えるLINQはどのように書けばよろしいのでしょうか?
(質問2)
Select句で、”IN0020”と”IN0015”の列を取得するには、Select句をどのように記述すればよろしいでしょうか?(dtcode("IN0020"),dtcode("IN0020")とするとエラーになる)
(質問3)
EnumerableRowCollection(Of Object) は、EnumerableRowCollection(Of DataRow)とするとエラーになります。マイクロソフトのHPでは、Public Function AsEnumerable (source As DataTable) As EnumerableRowCollection(Of DataRow)となっていますが、エラーになる理由はなんでしょうか?
https://docs.microsoft.com/ja-jp/dotnet/api/syst …
詳しい方宜しくお願い致します。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Dt As New DataTable
Dim Dc As DataColumn
Dc = New DataColumn
Dc.ColumnName = "IN0010"
Dt.Columns.Add(Dc)
Dc = New DataColumn
Dc.ColumnName = "IN0015"
Dt.Columns.Add(Dc)
Dc = New DataColumn
Dc.ColumnName = "IN0020"
Dt.Columns.Add(Dc)
Dt.Rows.Add({1944, 107, "山田"})
Dt.Rows.Add({1959, 109, "林"})
Dim tmp As EnumerableRowCollection(Of Object) = From dtcode In Dt.AsEnumerable()
Where dtcode("IN0010") = "1944"
Select dtcode("IN0020")
MsgBox(tmp(0).ToString)
End Sub
No.3ベストアンサー
- 回答日時:
(回答1)
「フォームにTextBoxを置いて、TextBoxの入力内容に従って、”1944”と”1959”を切り替える」
の意味をもっと具体的に書いてください。
Dt.Rows.Add({1944, 107, "山田"})
Dt.Rows.Add({1959, 109, "林"})
を
Dt.Rows.Add({1959, 107, "山田"})
Dt.Rows.Add({1944, 109, "林"})
にしたいということですか?
Where dtcode("IN0010") = "1944"
を
Where dtcode("IN0010") = "1959"
にしたいということですか?
いずれも、直接書いてある箇所を、変数なりなんなりに変えればできます。
(回答2)
(回答3)
まず、
Public Function AsEnumerable (source As DataTable) As EnumerableRowCollection(Of DataRow)
が適用されるのは
Dt.AsEnumerable()
だけです。
対して
Dim tmp As EnumerableRowCollection(Of Object) = From dtcode In Dt.AsEnumerable()
Where dtcode("IN0010") = "1944"
Select dtcode("IN0020")
というプログラムで 変数tmpに入れようとしているのは
From dtcode In Dt.AsEnumerable()
Where dtcode("IN0010") = "1944"
Select dtcode("IN0020")
という式(の評価結果)です。ここまでで1つです。
Public Function AsEnumerable() の戻り値は関係ありません。
https://docs.microsoft.com/ja-jp/dotnet/visual-b …
ここをよく読むとわかるのですが
Select では
・1つだけ値を指定したら、その型
・カンマ区切りで複数指定したり、列の別名を指定したりすると「匿名型」
のIEnumerable(of T)を返します。
(細かくは違うところもあるかもしれませんが)
Select dtcode("IN0020")
の場合、
・dtcodeはDataRow型→ dtcode(列) は Object型
なので、このSelectにより IEnumerable(Of Object) が返ります。
※ 実体は EnumerableRowCollection(Of Object) かもしれませんが
「dtcode("IN0020"),dtcode("IN0020")とするとエラーになる」
のは、
> var1
> 任意。 列式の結果を参照するために使用できる別名。
にあたる部分を推測できなかったためのものでしょう。
先のマニュアルの例では
Select product.ProductName → ProductName という列名
といった推測ができます。
よって、解決策の一つは「列名となるものを指定する」です。
ただ
Option Strict Off や Option Infer On の状態なら、匿名型の扱いも楽なのですが、
Option Strict On, Option Infer Off の状態だと、匿名型を使うのが面倒です。
なので、もう一つの方法「Select で一つの値だけを指定する」を使うのがよいでしょう。
複数の値を使いたいなら、それを一つにまとめるような仕組みを使います。
・dtcode は(複数の値をまとめた)DataRow型です。Select dtcode で IEnumerable(Of DataRow)になります
・Tuple(of 〜)も即席のクラスを作るのに便利です。
・同じ型だけを使うのなら、配列も使えます。
・面倒ですが、(専用に作った)クラス/構造体も使えます。
ご返答有難うございました。
知りたいことが、全て記載されています。
熟読して、自分のものにしていきたいと思います。
有難うございました。
No.2
- 回答日時:
詳しい訳ではないです。
やってみて結果が出たら『あら不思議』な初級レベルのオッサンです。
Dim tmp As EnumerableRowCollection(Of DataRow) = From dtcode In Dt.AsEnumerable()
Where dtcode("IN0010") = TextBox1.Text
Select dtcode
MsgBox(String.Join("_", New String() {tmp(0)("IN0010").ToString, tmp(0)("IN0015").ToString, tmp(0)("IN0020").ToString}))
Console.WriteLine(String.Join("=", New String() {tmp(0)(0).ToString, tmp(0)(1).ToString, tmp(0)(2).ToString}))
出力結果:
1944=107=山田
No.1
- 回答日時:
質問1だけ
Where dtcode("IN0010") = "1944" と書いている行の"1944"を変数として、その中の値を"1959"に変えてあげればうまくいくかも?
私は、C#をメインに使っていますし、LINQでDB検索する場合には質問にあるようなSQL形式ではなくて、メソッド形式を使うことが多いので、質問2,3は分からないのですけどね。
ちなみに、最新のASP.NET Core BlazorではVB.NETはサポートされず、C#かF#だけになったようなので、C#をメインにされるほうがいいかもしれませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/11 08:33
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
2つのDataTableをJoin
Visual Basic(VBA)
-
この行は既に別のテーブルに属しています
Visual Basic(VBA)
-
-
4
DataGridViewで入力チェック後、フォーカスをあてたい
Visual Basic(VBA)
-
5
VB.net 重複チェックがしたいです
Visual Basic(VBA)
-
6
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
7
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
8
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
9
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
10
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
11
メッセージボックスを大きくする方法
Visual Basic(VBA)
-
12
TextChangeイベントが発生しない
JavaScript
-
13
DataTableから条件を満たした行を別のDatatableへコピーしたい
その他(プログラミング・Web制作)
-
14
CloseとDisposeの違い
Visual Basic(VBA)
-
15
vb.netからエクセル関数書き込み
Visual Basic(VBA)
-
16
データベースのINT型項目にNULLはNG?
MySQL
-
17
ある文字列が全て数字であるかどうかをチェックするには?
Visual Basic(VBA)
-
18
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
19
ActiveReportについて
Visual Basic(VBA)
-
20
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロ 特定のセル値のみクリ...
-
変数名の取得
-
C言語 1から20までの逆数の和を...
-
C#の質問です
-
テキストボックスのvalueとtext...
-
ComboBoxで選択した値をReplace...
-
代入したのに値が更新されない...
-
ExcelでGaussian fittingをした...
-
Powershellのparamについて
-
VBでBtrieveファイルにアクセス...
-
VBA(自然数)
-
VB.NETのスクロールバーコント...
-
C# get set
-
エクセルユーザーフォームの日...
-
C#2008でWebBrowserコントロー...
-
[VBA]選択範囲の下から上に処理...
-
変数に代入してある数値を表示...
-
VB初心者。小数点以下の表示で...
-
ISDBNULLをスルーしてDBNULLが...
-
(Excel) マクロによる値の貼付け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
ハッシュテーブル(連想配列)が...
-
Excel VBAのリストボックスの値...
-
マクロ 特定のセル値のみクリ...
-
PysimpleGUIでデータベースを作る
-
VB.NETでコンボボックスの1行目...
-
変数名の取得
-
power BI クエリエディター 〇...
-
VB初心者。小数点以下の表示で...
-
PL/SQLでのTO_DATEの時間取得に...
-
【C++/CLI.NET】コンボボックス...
-
値を返さないコード パス
-
Powershellのparamについて
-
Excel VBA 複数選択したリスト...
-
DataTableに対するLINQについて
-
ユーザーフォームのテキストボ...
-
C# get set
-
変数に代入してある数値を表示...
-
VBAでWEB上の入力項目に値をい...
-
VB.NETでアクティブなformを知...
おすすめ情報