VB.NET Lambda不调用方法

时间:2012-10-25 17:56:00

标签: vb.net linq methods lambda

我正在为一系列数据库结果集编写一个包装器对象。这样做时,我注意到使用 LINQ Lambda 表达式查询时出现问题。具体来说,调用lambda中的方法似乎总是将结果集设置为空,并且从不实际触发我试图过滤的方法。这是代码:

' Query and filter container results 
Public Function [Filter](pFilter As IFilter(Of T)) As System.Linq.IQueryable(Of T)
    ' THIS YIELDS AN EMPTY SET EVEN WHEN pFilter.Test(o) ALWAYS RETURNS TRUE
    Dim lResult As System.Linq.IQueryable(Of T) = mTable.Where(Function(o As T) pFilter.Test(o))

    Return lResult
End Function

pFilter使用此签名实现IFilter:

Public Interface IFilter(Of T)
    Function Test(ByVal pObject As T) As Boolean
End Interface

我突破了尖头pFilter.Test(o)并发现它实际上从未被调用过。奇怪的是,如果我用True替换pFilter.Test(o),我会按预期收到整个记录表。此外,在任何情况下,我都没有收到编译时或运行时错误。

我是 Lambdas LINQ 的新手,所以完全认识到我可能无法理解我试图完成的限制。非常感谢任何帮助!

解: 当作者让我走上正轨时,我已经标记了一个解决方案。这个问题的真正本质源于我试图强制.NET函数成为LINQ可能变成SQL语句的东西(这是不可能的)。为了解决这个问题,我已经改变了我的IFilter,以便为Test方法返回System.Linq.Expressions.Expression(Of Func(Of T,Boolean))。现在我可以创建强类型过滤器,它返回谓词并直接将它们传递给Where()而不使用lambda表达式。我还使用 LinqKit 使那些可能正在完成类似任务的人更轻松地完成这项工作。

1 个答案:

答案 0 :(得分:1)

我想我发现了你的问题 - 理解IQueryable的概念。以下是本文中的内容:Lazy Loading With The LazyList

  

IQueryable是Linq To Sql的基石,并且(我认为)   是一个杀手级功能:延迟执行。 IQueryable本质上创造   您可以将其视为可枚举列表的表达式 - 和   只有当你迭代或要求一个值时才会执行查询。

所以你可能从未使用过结果,这就是为什么它从未被调用过。 .NET框架只为您构建了表达式树,但没有进行任何处理。

另请参阅:IQueryable vs. IEnumerable