直接使用函数和作为lambda表达式

时间:2012-04-24 16:12:41

标签: vb.net linq linq-to-sql lambda

有没有更好的方法来实现这个?我应该关注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

我想要lambda表达式的原因是因为我希望该函数能够一直通过LINQ-to-SQL转换为SQL。我想要直接版本的原因是因为我有其他代码,我想在提交更改之前验证单个序列号。我担心GetValidSerialNumbers.Contains(serialNumber)会执行一个比必要更复杂的查询。

1 个答案:

答案 0 :(得分:0)

Compile方法非常慢,因为它需要从表达式中发出IL。调用已编译的函数将导致另一个编译:JIT编译。

我建议您将Compile的结果缓存在静态字段中。

您采取的一般方法是好的。这是DRY。