【vb.net】LINQ to EntitiesでServer日付を取得するには

これをLINQ to Entities で取得している!と言って良いものかどうか微妙なところではあるけど、 .
NET Framework4から?使えるようになった ExecuteStoreQuery を使って簡単に取得できた。

Using context As New Entities 
‘ サーバ日付を取得
Dim serverDate As Date = context.ExecuteStoreQuery(Of Date)("select getdate()").First()
End Using

この例ではSQLServer だけど。Oracle のプロバイダってできたんだっけ・・・
他のRDBで同様の手法で取得できるのかは定かではありません。。

そういや、かなり久々な更新だ・・・なんか書く気がしなくて。。
最近はWPFを勉強しています。
VB6上がりな俺には、なかなかMVVMは難しい。

世の中のVB戦士?達はこれについて行けてるんだろうか。。負けるな戦士達!(ほとんど自分に言っています)

■Entity SQLの俺メモ

なんか最近、LINQ to EntitesやObjectQueryで複雑なクエリでもExpressionとかを
多用して、誰が読めるんだ・・・みたいな複雑なクエリをうーん、うーん・・と悩みながら頑張って
書いてたんだけど、複雑なクエリはEntity SQLを直接書いた方が早いことに気づいた。

最初はMicrosoft独自の謎のSQLなんか覚えたくないなぁ・・・と敬遠してたんだけど、
かなり標準的なクエリに近いことが分かった。oracleやsqlserverみたいな主要なRDBのSQLに
慣れてる人なら、なんら違和感なく書けると思う。

めんどうなので箇条書きです。。

前提条件として、Entity SQLはあくまでも、Entity Data Model(EDM)に対してのクエリなので、
from句のテーブルの指定は、EDM名.テーブル名 のように修飾する必要がある。

・where
・left join
・inner join
・group by
・order by
ページングの実装に便利そうな、SKIPを指定することで先頭n行をスキップでき、
LIMITで何行取得するかを指定できるみたい。ただしselect句のTOPと併用はできないので注意。

・演算子
比較演算子は、LIKE(escapeを記述することで、エスケープ文字の指定可)、
BETWEENIS (NOT) NULL も使える。

・論理演算子
ANDNOTORCASE WHEN..THEN..ELSE..END
・集合演算子
EXISTSIN(括弧ではなく中括弧 { } で括る必要がある)、UNION

上記は、基本的にRDBと全く同じ記述で書けた。

ただし、select 句が少しだけ特殊で、RDBで取得されてくる一般的なイメージで取得するには、

select value row(tbl.field1, tbl.field2) from

のような感じに書かなきゃないみたい。 distincttopも指定可。 * (アスタリスク)は使えないので注意。
これは集計関数になるけど、count(*)はcount(0)で同じ結果になるみたい。

 

このように基本的な構文はかなり違和感なく書けることが分かると思う。
ただし組み込み関数については、RDBごとに実装が違ったように、Entity SQLでも使えるものが異なる。

Entity SQLの正規関数(名前空間 EDM)については、リファレンスを参照。

Microsoft プロバイダー固有の関数も使えるみたい。SqlServer 名前空間を指定して使用。以下のような感じ。 
select SqlServer.LEN(…) from

以上、本当に箇条書き。自分でやってみたものや、目に付いたものを書いているだけで、
書いていないことはいっぱいあるので、リファレンスを一読することをオススメします。。

でも、敬遠してた人は余裕に思えてきたのでは!

■【vb.net】LINQで匿名型じゃなく独自の型で返す方法

よく、このようなことを書いてあるんだけど、よっぽど当たり前のことなのか、
具体的なやり方が書いていないので一応書いてみる。

以前投稿した記事のLINQクエリを、独自の型で返すように書き換えてみる 。

・以前の記事のクエリ式(を、より簡単に省略したもの。。)

Using context As New userEDM
Dim query = From a In context.user _
Select New With { a.id, a.name}
 

Dim result = query.FirstOrDefault()
Console.WriteLine(result.name)
End Using

こうすると、resultは当然匿名型となる。

・これを独自の型で返すように書き換える。

Class anonType
Public id As String
Public name As String
End Class
 

Using context As New userEDM
Dim query = From a In context.user _
Select New  anonType() With { .id = a.id, .name = a.name}

Dim result = query.FirstOrDefault()
Console.WriteLine(result.name)
End Using

こう書くことで、resultはanonType型として返される。

こういうことをしなければならない時って、匿名型はObject型で渡すしかないので、
その先でなにか取り出す処理をするときだろうけど、
本来返されるべき匿名型が複雑になるほど、独自の型の定義が複雑になってしまうので
こういうことは、やらないほうが良いとは思う。。

よくあるパターンとして、外部結合なんかをしてて、
IEnumerable(Of 匿名型)とかになってるとすると、
その中にキャスト可能な型が入ってるなら、
リフレクションでcast可能になる部分までは取り出して
それをcastするのが良いのかなぁ・・・と。。

まー、castの話をするなら、匿名型は同じ定義なら同じ型になることが保障されているので、
ダミーの匿名型を宣言して、それをジェネリックメソッドに引き渡して、型パラメータTを
型推論させて、DirectCast(src, T)とかしてやればcastは可能ではあるんだけど・・・
なんだかなぁ・・・みたいな。

(2010/12/25追記)
Classの部分は、構造体でもok。

■エクスプローラでLAN上のPCをクリックすると暫く固まる現象

上記の件でずーっと原因が掴めなくて悩んでいた。
自宅環境はワークグループで、ワークグループをクリックすると
コンピュータの一覧が表示されると思うんだけど、ここまでは速い。

・・・が、コンピュータ名をクリックすると暫く固まった後に表示される。

表示された後は、そのPCの共有フォルダをアクセスする分には
サクサクなんだけど、ツリー最上位のコンピュータ名をクリックするとまた固まる。

一体なんなんだ・・・?pingは普通に飛ぶし、nslookupしてみても名前解決に問題はない。
というか \\192.168~でIPを直指定しても遅い。どう考えてもおかしい。ワカラン。

そして冷静に考えてみた。ま さ か

ノートン先生、また貴方ですか・・・.

なんだかよく分からないけど、スマートファイアウォールとかいう機能の設定で
信頼制御って部分があるんだけど、そこで各クライアントPCのMACアドレスに対して
「完全信頼」に設定してみたら、ウソのように速くなった。

試しに、タスクトレイの「スマートファイアウォールを無効にする」にしてみても、
変わらなかったのに・・・だ。

先生、一体どうなってるんです?無効にしなさいよと言っているのに、
完全に無効になってないじゃないですか。

いい加減、キレますよ私も!!

来年は、カスペル先生にしようかな・・・。

■TvRockは非常に優れた神ツールではあるが・・・

・・・であるのは間違いない。
だが、やっぱり使い方って人によって千差万別で、TvRockであっても
痒いところに手が届かない部分がある。

その1つにずっと不満だった部分なんだけど、
録画鯖側は基本的には、スリープタイマー状態で運用してて、
CPU使用率が5%、ネット使用率が1%って設定にしている。

で、ウチの場合は録画した番組はネットワーク越しにメインPCで見てるわけ
なんだけど、その程度じゃCPU使用率もネット使用率も1%にも満たなくて
視聴中に勝手にスリープに入ってしまうってことがよくあった。

しょうがないので、わざわざリモートで入ってスリープタイマーを解除してから
視聴していたけど、非常にめんどくさかった。

そこで考えたんですよ。TvRockのスリープタイマーを切らずに、
スリープを抑止するソフトを別に導入すればよくね・・・?と。

自分の場合はネット使用率が1%よりももっと細かく設定できるソフトがあれば
良いわけなので、ググってみたら丁度良いソフトがみつかった。その名も・・・

サスペンドコントローラ!!

コイツはトラフィック量で抑止の設定をできるので、
単位はよくわからんが、2のべき乗で設定すりゃいいのかな・・・
と思い、きっと少ない量であろう・・・と思われる「4096」を上回ったら
抑止するような設定にしてみた。

そしたら見事、視聴中はスリープされないようになりました!
画面は見てないけど、TvRockのスリープしなさいよ!命令も抑止してくれるみたい。

スリープ移行シチャウヨーっていうインジケータはおそらく出てるんだろうけどね。
何度も・・・。

■ASUS AT3N7A-Iでxpインストール後にAHCIモードに変更する

こちらのブログを参考にやってみた。

Gigabyte GA-E7AUM-DS2H #5

 手順は上記とほぼ一緒だが、一応書いておく。

 

1.ASUS公式よりドライバをダウンロードしてくる

  ココのSATAというところ。

2.ダウンロードしたドライバをインストール

  a.[コントロールパネル]-[ハードウェアの追加]を実行

  b.「ハードウェアは接続されていますか?」⇒ はい

  c.「IDE ATA/ATAPI コントローラ」を選択

  d.「ディスク使用」で \RAID\Driver\AHCI\XP32 の nvgts.inf を選択し、「次へ」をクリック

  インストール完了。

3.レジストリエントリを追加。

 ※参考サイトのファイルを直リンクもまずいので、内容を転載させていただく。

Windows Registry Editor Version 5.00
;
;for GeForce 9400/nForce 730i(MCP7A) AHCI Controller
;
;[dev_0ab8]=device id : GF9400/nf730i AHCI controller
;[nvgts]=service name : nvidia serial ata driver
;
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10de&dev_0ab8&cc_0106]
"Service"="nvgts"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

  上記をメモ帳にコピペし「適当なファイル名.reg」で保存後、

  保存したファイルを右クリックし「結合」を選択。終わったら再起動する。

4.再起動時、BIOSでAHCIモードに変更する。

5.再起動後、[デバイスマネージャ]を開き、「!」マークが付いているデバイスを削除する。

  ※「IDE ATA/ATAPI コントローラ」の部分。

  知ってる人も多いかもだけど、窓キー+Breakキーが[システムのプロパティ]のショートカットなので
  そこの[ハードウェア]タブから[デバイスマネージャ]を開くのが早いよ!

 

以上の手順で変更できた。感謝感謝。

■今年こそは有意義な1年にしたい!

というわけで、昨年は自分的になんにも得ることのできなかった1年だったな…と、
悔いております…。

最近思うんだけど、自分のやりたいことが全く見えなくなってきた。
それで自己分析をしてみた

自分は、プログラム以外にも、趣味も含めればいろいろなことをやっているんだけど、
じゃぁ、俺は一体なにをしたいんだろう…って。

結局、誰かに認めてもらいたいんだな…と思った。あたりまえかもしれないけど。
自分が考えたことを、なんらかの形でアウトプットして、誰かに見てもらい
そして認めてもらう。

そういう願望しかないのかもしれない。今現在持っているアウトプット先で、
寝る間も惜しんで取り組んでるものなんて、1つも無いもんなぁ…。

考え方がおかしいんだろうな。認めてもらうことが先行してるから、
その手段に没頭できない…というか。仕事も含めてね。

俺は、なにをしたいんだろう。遅いけどそのへんを今年はよく考えてみようと思う。
趣味すら無いってことになるのかもしれないしなぁ。
とにかくなにやってても満たされないんだよね。

まー、なんだかワカランけど、今年は良い年にするぞー!
あ、皆様今年もよろしくお願いします!新年からネガネガしてますが・・・

■通訳のコンパイラ君。そろそろキミはクビにしたいのだが…?

コンパイラ君。わざわざ来てもらってすまないね。キミを呼んだのは他でもない。

キミの業務内容について、何年も何年もキミの成長を見込んで粘り強く見守ってきたつもりだが、
私はもう我慢できそうもない。今日は言わせてもらうよ。いいかい?

では本題だ。

まず、通訳(コンパイラ)の仕事とはどういうものだと思っているのだね?
依頼主は、無能な通訳の程度に合わせて話してあげる(プログラムする)のが普通だとキミは考えているのかね?
たとえば、『単刀直入』という言葉。これをキミは『short sword direct insert !!』などと、
必殺技のごとく声高らかに叫ぶつもりかい?

話にならないなキミは。

どこの世界に、通訳された言葉(バイナリ等)まで意識しなきゃ不安で不安でしょうがない通訳なんて居るというのだね?
基本的に母国語(高級言語)しかしらない我々に、外国語(機械語)を覚えろとでも言うつもりかい?
それならキミはもう必要ないということにならないかね。

私は話したいことを、話したいように表現し、先のことなど知りたくないのだよ。
普通は、そうだろう?キミは通訳として失格だよ。
勉強して出直したまえ。それがキミの仕事だ。

少々キツく当たってしまったが、私は待っているよ…
キミが大きくなって帰ってくることを…!

ナニコレ…すいませんでした…。

■【vb.net】LINQ to Entitiesで列名に別名を付けるには

匿名型を初めて使うという人も居るかもなので、一応書いておきます。
別にLINQ to Entitiesのみに限ったことでもありませんが…

下記のリンクは以前書いた記事ですが、この記事中の匿名型の宣言はプロパティ名を省略してある為、
そこをきちんと書いてあげればok。

以前の記事: 【vb.net】LINQ to Entitiesで左外部結合をする

・クエリ式

Using context As New userEDM
   Dim query = From a In context.user _
           Where a.id = "なんか入力値" _
                        Group Join b In context.userRole _
                          On a.id Equals b.id _
                          Into rResults = Group _
                        From c In rResults _
                        Select New With {.id2 = a.id, .name2 = a.name, .role2 = c.role}

   …以降は上記を利用する処理
End Using

このように書いてあげると、列名に”2”が付いて宣言されます。(赤字の名前はなんでもok)

LINQのクエリ式のサンプルとかだと、大抵省略してあるんですよね…。
省略されると代入されたプロパティの名前が付きます。

あとは…EDMのマッピング時に概念モデルの列名を変更しておくという手もあります。

■twitterとネタバレ

今日、twitterで最近出たゲーム(RPG)についてちょっとネタバレされた。
で、イラっと来てしまって、文句を言ったんだ。

「やめてくれ。一切なにも知りたくない。感想すら見たくない。」の様な言い分。

なぜ強い言い方をしたのかと言うと、そのネタバレと感じる感覚も人それぞれだから。
あっちのネタバレは、こんなトピックで俺自身がネタバレ書くわけにいかんし書かないけど…。
発売して数日は、まぁお祭りだしな…と我慢してたんだけどね…。

そしたら、何人かに非難を浴びてしまった。

・これでも気をつけて話している。
・なら、いつ解禁なのか。
・先にクリアした人らは、基準が分からないので、いつまで経っても話せない。
・それはアナタの感覚にすぎない。
・ネタバレが嫌なら唯一の防衛手段は、最速でクリアすることだ。
・ネットを断て。
・ある程度自衛してくれ。

まぁ、ごもっともだとは思う。少なくとも、2ch、個人ブログの巡回は止めてたんだけどね…。

俺も些細なネタバレで言ってしまって悪いとは思うけど、
常識的な感覚で、RPGで発売から6日あまりで解禁にはならんだろう…。

掲示板とかならまだいいよ。見なけりゃ良いから。だが、twitterは自分でフォローリスト作れるとはいえ、
不特定多数が見るものだからなぁ。そして受動的な面もある。

twitterすら断てと言われれば、それまでだが…。
最終的には、リムーブしてくれて構わないというので、
一時的にリムーブすると伝えて、リムーブしたけど。
別に険悪な感じではなくね。「また、よろしく」と言ってくれた。

twitterっていうツールの性格から考えれば、気に入らんなら消せは真理ではあるんだよね。
それも寂しいな…とは思うんだけど。
どうしても受動的な面があるから、その人が嫌いではないんだけど消すより他ないってことが起こりえる。
ここが不満だなぁ。もう少し発言できる層の多層化とでも言うのか、レイヤーを分けれるようにして欲しい。

まー俺が悪いのかな!ゴメンネ!