2010-10-04 3 views
0

Imagind У меня есть следующие в VB:как отправить LINQ фильтр в качестве параметра

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 

благодаря

ответ

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(Function(p) p.UserName = username) 
1

Ваш фильтр Тип параметра должен быть Expression < < Func BOOL > > я считаю. Затем вы можете передать ему лямбда-выражение, которое вы можете использовать в качестве переменной.

Если вы используете LINQ-to-objects, вы можете просто использовать Func <bool> как тип параметра.

+0

Sorry о C# синтаксис. Я не уверен в эквиваленте VB, но я уверен, что вы можете понять это. –

+0

Нет необходимости в выражении с linq-to-objects. Предикат достаточно хорош. –

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 
Смежные вопросы