如何发送LINQ过滤器作为参数

时间:2010-10-04 14:43:26

标签: vb.net linq-to-objects

想象我在VB中有以下内容:

function doSomething()

    From ou In ctxt.Users.Where(Function(p) p.UserName = username)
    ...

end function

如何将过滤器作为参数发送(如下所示)?

function doSomething(filter as whatTypeHereAndHowToInstantiateInCallingFunction)

    From ou In ctxt.Users.Where(filter)
    ...

end function

感谢

3 个答案:

答案 0 :(得分:2)

你可以从这样的事情开始:

Sub doSomething(Of T)(filter as System.Func(Of T, Boolean))

    From ou In ctxt.Users.Where(filter)
    ...

End Sub

我不知道ctxt.Users的类型,但你可以用你的类型删除泛型T并将一个Func(YOURTYPE,Boolean)传递给doSomething。

然后你可以像这样使用它:

doSomething(Function(p) p.UserName = username)

答案 1 :(得分:1)

您的过滤器参数类型应为Expression< Func< bool>>我相信。然后,您可以将lambda表达式传递给它,您可以将其用作变量。

如果你正在使用LINQ-to-objects,你可能只想使用Func< bool>作为参数类型。

答案 2 :(得分:1)

您也可以使用谓词,例如

<TestMethod()> _
Public Sub test1()
    Assert.AreEqual("a", WhereExample(Function(x) x = "a"))
End Sub

Public Function WhereExample(ByVal filter As Predicate(Of String)) As String
    Dim str = New String() {"a", "b", "c"}
    Return str.ToList.FindAll(filter).FirstOrDefault
End Function