2012-01-27 7 views
4

私はList(EmailItemの)を返すDLLアセンブリを持っています。 EmailItemは、実行にかかる処理時間のために遅延ロードするいくつかのプロパティを含むカスタムクラスです。基本的に私のビジネス要件に基づいたヘルパーです。Where-Objectは、関連するオブジェクトではなく、ソースオブジェクトの* all *プロパティを評価するのはなぜですか?

Windowsサービスおよびコンソールアプリケーションでこれらのオブジェクトを処理すると、これらのプロパティは静かに呼び出されるのを待っています。

PoShを使用してこれらのクラスのセットを取得し、Where-Objectを使用してそれらをフィルタリングすると、Where-Objectスクリプトブロックやスクリプト内の他の場所で参照されなくても。カスタムフィルターを作成しようとしましたが、同じ動作を経験しました。 Select-Objectを使って気にする値を投影しても、同じことが起こります。

オブジェクトがPSObjectsに変換され、PowerShellによってプロパティが設定されていると推測されます。

これを回避する方法やこのスクリプトをオフにする方法はありますか?私はこれらのヘルパーを含まない "軽量"オブジェクトを追加する過程にありますが、それはお気に入りのWindowsスクリプティング言語をサポートするだけの厄介な作業です。

ありがとうございました!

+0

「Select-Objectを使用したい値を投影しても、同じことが起こります。」本当に?!これは起こってはいけません....これは、むしろ無駄な選択オブジェクトをレンダリングします! – Tom

+1

「Where-Object」ステートメントはどのように見えますか? – Rynant

+1

私の簡単なテストでは、あなたが説明しているように 'Where-Object'は動作しないことがわかります。結果がコンソールに書き込まれたときにプロパティが実際に評価される可能性はありますか?それで、すべての特性を実際に評価することができます。 –

答えて

5

これは表示されません。一般的には真実である。あなたの場合にはさらに微妙なことが起こっています。

私はこのクラスを定義した:

namespace Lazy 
{ 
    public class LazyClass 
    { 
     public int One { get { return 1; } } 
     public bool LazyEvaluated { get; private set; } 
     public string LazyProperty { get { LazyEvaluated = true; return "Lazy"; } } 
    } 
} 

は、次に、これらのコマンドを実行しました:

1: $lazy = 1..4 | % { New-Object Lazy.LazyClass } 
2: $lazy | % { $_.LazyEvaluated } 
3: $lazy | ? { $_.One -eq 1 } | % { $_.LazyEvaluated } 
4: $lazy 
5: $lazy | ? { $_.One -eq 1 } | % { $_.LazyEvaluated } 

コマンド2からの出力は偽の4倍でした。 コマンド3の出力は4回Falseでした。 コマンド4の出力により、各オブジェクトでLazyPropertyが評価されました。 コマンド5からの出力はTrueで4回でした。

これらのオブジェクトを「Select One、LazyEvaluated」にパイプしてみましたが、LazyPropertyが評価されませんでした。

+0

このレベルの研究をしてくれてありがとう!私は来週私のコードを改訂し、私の場合には違うものが見つかるかどうかを確認します。 foreach()を使用してアイテムを繰り返したときに、私はこの問題を経験しなかったことが不思議です。私が何か良いことを学ばなければ、私は戻ってこれを答えとするでしょう。なぜなら、その問題はPoShには一般的ではないということがかなり確定しているからです。 –

2

私はあなたがどこオブジェクトの動作を変更することができるとは思わないが、あなたはforeachの、およびIFとすることを交換してみてください:

例えば

foreach ($emailitem in $emailitems){ 
    if ($emailitem.subject -match 'important'){$emailitem} 
} 
+0

私はこれが私には起こらなかったことを愚かに感じます。私はPowerShellで常に "パイプ"を考えると思う。これは、実際には、問題を回避しました。私はそれを理解していない。皮肉なことに、クエリをさらに上流にプッシュする方法も学んだので、PoShでフィルタリングを行う必要はもうありません。 –

関連する問題