2011-01-25 4 views
0

私は、エンティティフレームワーク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構文)を使用しているかもしれません。

+1

好奇心から逸脱した場合、 "$ myObjectContext.VehicleTypes | write-host"対 "$ myObjectContext.VehicleTypes | out-host" – beefarino

+0

$ myObjectContext.VehicleTypes | Write-Hostは上記のエラーを生成しません。その代わりに、各オブジェクトの種類(実際には、完全な名前空間とMyNamespace.VehicleTypesのようなタイプのもの)画面に、代わりの実際のオブジェクト値を書き込みます。 $ myObjectContext.VehicleTypes | Out-Hostは上記のエラーを生成します。先端に感謝します。 –

答えて

1

このコードで実行される列挙は、 PS> $myObjectContext.VehicleTypes | Where-Object {$_.VehicleTypeID -eq $vehicleTypeId} であることがわかります。

ネイティブフィルタリングを実行する場合は、データにアクセスするためのコマンドレットを作成するか、ネイティブフィルタをサポートするプロバイダを作成する必要があります。

+0

は、私はそれがすべてのクライアント側に起こっていたことを恐れていた、とコメントし、それを通じてthinnking自分の後に、それは完璧な理にかなっています。理由クエリは、MSがサーバー側で実行するカスタム式を構築したLINQのツーエンティティを内蔵しているためにLINQを使用して、サーバー側が起こります。 –

+0

上記のコメントを編集しようとしましたが、5分経過しています。とにかく、私が何を言おうとしているのかを明らかにする。私の理解では、その理由クエリがLINQのツーエンティティとサーバ側が起こるということであるAPIを評価し、サーバ側で実行する適切なSQLたstatmentsに減らすカスタム式と式ツリーを構築するためです。 –

+0

はあなたの書き込みホスト/アウト、ホスト実験に基づいて、それは間違いなくPowerShellの書式設定のサブシステムの内部の何か。必ずconnect.microsoft.com/PowerShellに登録してください – beefarino

0

少し遅れていますが、TheErrorは、.net v2.0を実行しているpowershell.exeが原因である可能性があります。 cmo999のanswerと私自身の類似のquestionを参照してください。

これは、上記のリンクにcmo999によって記載されているようにpowershell.exe.configを変更/追加することにより、.NET 4.0の下で実行する可能性のconfigureたpowershell.exeです。