私は、エンティティフレームワークObjectContext
を保持するVisual StudioでDLLを作成しました。 PowerShellからさまざまなObjectSet
にアクセスしようとしています。私はWebサービスから引き出しているXMLファイルがいくつかあり、PowerShellのxml機能(自動プロパティ生成、致命的ではない$ null評価)を使用して、着信xml値をエンティティにマッピングしたいので、これをやっていますC#Xmlクラスを使用する必要があります。基本的に私のPowerShellスクリプトはデータローダーです。PowershellのEntity Framework ObjectSet
ObjectContextを作成してインスタンス化できます。 $myObjectContext | Get-Member -MemberType Property
を使ってすべてのプロパティを見ることができます。しかし、正確に項目がクエリーからObjectSetに返された時点を理解することができません。
Linq-to-Entitiesでは、遅延ロードがあり、コレクションが列挙されるときにのみオブジェクトがロードされることがわかります。 extenionメソッドを明示的に呼び出そうとしましたが、PowerShellはラムダ式のサポートを提供していないようです。
ここに私の質問です。クエリが明示的に列挙されることをいつどのように知るのですか?たとえば、プロパティの1つ(ObjectSet
と定義されています)。<VehicleType
> VehicleTypes {get;}
format-default : Exception has been thrown by the target of an invocation. + CategoryInfo : Not Specified: (:) [format-default], TargetInvocationException + FullyQualifiedErrorId : System.Reflection.TargetInvocationException
しかし、PS> $myObjectContext.VehicleTypes | Select-Object VehicleTypeID
が正しい出力を生成します(表:
PS> $myObjectContext.VehicleTypes
は、今後の参考のために、次のエラー、私はのように(TheError)ラベルます生成しますVehicleTypeIDの)
ただし、上記のようにTheErrorが返されます。
PS> $myObjectContext.VehicleTypes | Sort-Object
は常にコレクションを列挙しているようですが、コレクションを比較するにはすべての要素を調べる必要があるため、わかります。
コレクションが一度列挙された後、PS> $myObjectContext.VehicleTypes
を呼び出すと、TheErrorは上記のようにはならないことに注意してください。これは本当に奇妙ですが、私はそれが怠惰な読み込みと関係があると思います(これが私が上で言及した理由です)。
他の人がこの動作を私に確認/説明し、PowerShellでEntity Frameworkを使用するためのベストプラクティスを紹介してくれますか?
また、私がPS> $myObjectContext.VehicleTypes | Where-Object {$_.VehicleTypeID -eq $vehicleTypeId}
のようなことをすると、そのクエリサーバー側を実行するほどスマートになるか、またはDBからすべてのレコードをフェッチして、探しているものだけを返しますか?状況が後者の場合は、データアクセスにC#(あまりにもやさしいxml構文)を使用しているかもしれません。
好奇心から逸脱した場合、 "$ myObjectContext.VehicleTypes | write-host"対 "$ myObjectContext.VehicleTypes | out-host" – beefarino
$ myObjectContext.VehicleTypes | Write-Hostは上記のエラーを生成しません。その代わりに、各オブジェクトの種類(実際には、完全な名前空間とMyNamespace.VehicleTypesのようなタイプのもの)画面に、代わりの実際のオブジェクト値を書き込みます。 $ myObjectContext.VehicleTypes | Out-Hostは上記のエラーを生成します。先端に感謝します。 –