3

これを実装するより良い方法はありますか?ここで Compile メソッドのパフォーマンスを気にする必要がありますか?

     Public Overrides Function GetValidSerialNumbers() As System.Collections.Generic.IEnumerable(Of SerialNumber)
        Return Queryable.Where(allSerials, SerialNumberValidFunc)
     End Function

     Public Overrides Function IsSerialNumberValid(serialNumber As SerialNumber) As Boolean
        Return (SerialNumberValidFunc.Compile().Invoke(serialNumber))
     End Function

     Private ReadOnly Property SerialNumberValidFunc As Expressions.Expression(Of Func(Of SerialNumber, Boolean))
        Get
           If ProductionReceiptLine.MOOutput Is Nothing Then
              Return Function(sn As SerialNumber) sn.ItemInventory Is Nothing AndAlso _
                    (sn.Status = SerialNumberStatusValues.Planned AndAlso sn.MO Is ProductionReceiptLine.ProductionReceipt.MO _
                     OrElse sn.Status = SerialNumberStatusValues.Assigned)
           Else
              Return Function(sn As SerialNumber) sn.ItemInventory Is Nothing AndAlso _
                    (sn.Status = SerialNumberStatusValues.Planned AndAlso sn.MO Is Nothing OrElse sn.Status = SerialNumberStatusValues.Assigned)
           End If
        End Get
     End Property

ラムダ式が必要な理由は、その関数が LINQ-to-SQL を介して SQL に変換できるようにするためです。直接バージョンが必要な理由は、変更を送信する前に個々のシリアル番号を検証したい他のコードがあるためです。そしてGetValidSerialNumbers.Contains(serialNumber)、必要以上に複雑なクエリを実行するのではないかと心配しています。

4

1 に答える 1

0

Compile メソッドは、式から IL を発行する必要があるため、非常に低速です。コンパイルされた関数を呼び出すと、別のコンパイル (JIT コンパイル) が発生します。

Compile の結果を静的フィールドなどにキャッシュすることをお勧めします。

あなたが取っている一般的なアプローチは良いです。ドライです。

于 2012-04-24T19:44:45.060 に答える