C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: LINQ to Objectで更新処理


(過去ログ 43 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■23054 / inTopicNo.1)  LINQ to Objectで更新処理
  
□投稿者/ 鶏唐揚 (265回)-(2008/08/07(Thu) 18:23:31)

分類:[その他の言語] 

2008/08/07(Thu) 18:24:54 編集(投稿者)
[VB]2008
[OS]Vista

お世話になっております。今回ちょいとLINQを触ってみました。
構造体の配列があり、特定のメンバでフィルタリングして抽出 -> 更新して戻す
というのをやりたいのですが、LINQ to SQLでの更新を参考に組んでみたところ
コンパイルエラー「Expressionは値であるため、代入式のターゲットにすることはできません」となります

#変数名とかは、即興で確認してみたかったため適当です。お見逃しください。

Private Structure TEST
    Dim dat  As String
    Dim stat As Integer
End Structure

Private t(99) As TEST

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim r As Random
    Dim i As Integer
    
    For i = 0 to 99
        '0か1か
        t(i).stat = r.Next(0, 2)
        t(i).dat = ""
    Next
    
    'ステータスが1のもののみ抽出
    Dim lq = From n In t _
             Where n.stat = 1
    
    If lq.Count = 0 Then
        MsgBox("データないお")
    Else
        For i = 0 To lq.Count - 1
            lq(i).dat = "ステータスが1"
        Next
    End If
End Sub


上記コードで「lq(i).dat = "ステータスが1"」の部分でエラーとなります
やり方が間違っているのか、そもそもLINQ to Objectでは登録/更新/削除ができないのか…

ご教示いただけたらと思います
よろしくお願いします

引用返信 編集キー/
■23059 / inTopicNo.2)  Re[1]: LINQ to Objectで更新処理
□投稿者/ ghost_shell (18回)-(2008/08/07(Thu) 19:20:55)
ghost_shell さんの Web サイト
ghost_shell です。

エラーのヘルプは見られました?
http://msdn.microsoft.com/ja-jp/library/76435b93.aspx
引用返信 編集キー/
■23061 / inTopicNo.3)  Re[2]: LINQ to Objectで更新処理
□投稿者/ ghost_shell (19回)-(2008/08/07(Thu) 19:51:01)
ghost_shell さんの Web サイト
VB ムズい・・・

>   'ステータスが1のもののみ抽出
>   Dim lq = From n In t _
>             Where n.stat = 1

■配列にする
    'ステータスが1のもののみ抽出
    Dim lq = (From n In t _
             Where n.stat = 1).ToArray

■加工しておく
    Dim lq = From n In t _
             Where n.stat = 1 _
             Select New TEST() With {.dat = "ステータスが1", .stat = n.stat}

引用返信 編集キー/
■23064 / inTopicNo.4)  Re[1]: LINQ to Objectで更新処理
□投稿者/ Jitta on the way (152回)-(2008/08/07(Thu) 21:19:19)
No23054 (鶏唐揚 さん) に返信
> 2008/08/07(Thu) 18:24:54 編集(投稿者)
>
> [VB]2008
> [OS]Vista
>
> お世話になっております。今回ちょいとLINQを触ってみました。
> 構造体の配列があり、特定のメンバでフィルタリングして抽出 -> 更新して戻す
> というのをやりたいのですが、LINQ to SQLでの更新を参考に組んでみたところ
> コンパイルエラー「Expressionは値であるため、代入式のターゲットにすることはできません」となります

LINQ 関係なくない?構造体でしょ?Class でやってみそ。
引用返信 編集キー/
■23076 / inTopicNo.5)  Re[2]: LINQ to Objectで更新処理
□投稿者/ 鶏唐揚 (266回)-(2008/08/08(Fri) 09:44:04)
No23064 (Jitta on the way さん) に返信
> LINQ 関係なくない?構造体でしょ?Class でやってみそ。
確かにエラーはLINQ関係ありませんでした^^;
今までこのエラーにぶち当たったことが無く、LINQ使って初めて遭遇したので
勘違いしましたすみません

ghost_shellさんの提示してくださった方法だとエラーはでなくなりました。
が、新規に配列作ってそいつにぶち込んでるので当たり前なんですが元のtが更新されません。

SQLのような感覚で、条件を満たすレコードのみを更新させたいと考えています
できないのであれば一意に識別できるキー用メンバを追加しておいて、
フィルタリング後の構造体配列のキーと一致する元(t)配列を線形探索して更新していこうかなと考えてます。

#今作ろうとしているものはDB関係ではないので「構造体配列をやめれば?」は無しの方向で…
引用返信 編集キー/
■23080 / inTopicNo.6)  Re[3]: LINQ to Objectで更新処理
□投稿者/ よねKEN (171回)-(2008/08/08(Fri) 10:27:42)
No23076 (鶏唐揚 さん) に返信
> ■No23064 (Jitta on the way さん) に返信
>>LINQ 関係なくない?構造体でしょ?Class でやってみそ。
> 確かにエラーはLINQ関係ありませんでした^^;
> 今までこのエラーにぶち当たったことが無く、LINQ使って初めて遭遇したので
> 勘違いしましたすみません

Jittaさんの回答でうまく行きますよ。実際に試して確認しました。
TESTをStructureではなくClassにし、これに関連するその他の修正を加えればOKです。

> #今作ろうとしているものはDB関係ではないので「構造体配列をやめれば?」は無しの方向で…

構造体の配列でなくクラスの配列で行きましょう。

引用返信 編集キー/
■23081 / inTopicNo.7)  Re[4]: LINQ to Objectで更新処理
□投稿者/ 鶏唐揚 (267回)-(2008/08/08(Fri) 10:38:57)
2008/08/08(Fri) 11:03:54 編集(投稿者)

No23080 (よねKEN さん) に返信
> 構造体の配列でなくクラスの配列で行きましょう。
>
クラスにしたらまさに目的の動作を実現できました。

ただ…自分以外が作る.NETアセンブリDLLのメソッドの引数として渡そうと考えてたので、
クラスだとそのあたりちと面倒かもしれません。構造体だったらDLL内でも宣言してもらって、
渡すだけで済むと考えてたので。もう少し研究してみます(ディープコピー関連)
引用返信 編集キー/
■23083 / inTopicNo.8)  Re[5]: LINQ to Objectで更新処理
□投稿者/ ghost_shell (20回)-(2008/08/08(Fri) 10:48:12)
ghost_shell さんの Web サイト
参考にした文献の提示が無いので指摘が間違っているかもしれないのをご了承ください。

> そもそもLINQ to Objectでは登録/更新/削除ができないのか…

(DataContextクラス).SubmitChanges()というメソッドはありませんでしたか?
DBの追加/削除/更新はそれによって反映していると思われます。(未確認です)

たまたま見つけただけですが、参考になるかもしれません。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=3526527&SiteID=7
引用返信 編集キー/
■23115 / inTopicNo.9)  Re[6]: LINQ to Objectで更新処理
□投稿者/ 鶏唐揚 (270回)-(2008/08/08(Fri) 16:52:42)
2008/08/08(Fri) 16:56:03 編集(投稿者)

シリアライズ・デシリアライズでオブジェクトの配列のディープコピー方法を見つけました
http://csharp.yaminabe.info/2006/08/post_1.html

DLL実装側の人には、Objectで引数とって貰うか同じクラスをPublicで宣言してもらうことにします。
ということで解決にさせていただきます。ありがとうございました
解決済み
引用返信 編集キー/
■23131 / inTopicNo.10)  Re[7]: LINQ to Objectで更新処理
□投稿者/ ghost_shell (21回)-(2008/08/08(Fri) 18:40:01)
ghost_shell さんの Web サイト
なぜ値型、String型のみで構成される構造体の配列に対してディープなクローンを作りたい??
解決済み
引用返信 編集キー/
■23132 / inTopicNo.11)  Re[8]: LINQ to Objectで更新処理
□投稿者/ 鶏唐揚 (272回)-(2008/08/08(Fri) 19:03:15)
2008/08/08(Fri) 19:18:56 編集(投稿者)

No23131 (ghost_shell さん) に返信
> なぜ値型、String型のみで構成される構造体の配列に対してディープなクローンを作りたい??
それは経緯を見てください^^;

元々は外部マネージドDLLに引数で渡したり、差異比較用にコピーしたりする
のを簡単にやろうとしたため、構造体で考えていた

しかしLINQで一時割り当てな構造体となり、UPDATE相当の処理ができない
(LINQによって作られた配列じゃなく、元々の配列をLINQで更新したいということ)

Classでやればいいじゃないと助言を受けClassに変更

Classだとコピー処理でディープコピーせんといかん

今に至る

です。なので最終的に「構造体配列」ではなく「クラス配列」となりました。
あくまで構造体でやりたかったことがあり、ClassならPublicなメンバを持たせることで
似た形にすることができます。よって、DataContextでの手法は敬遠させていただきました。
ご理解していただけましたでしょうか
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -