One way is that you isolate the changing part of the where clause to your own method where you control if the item is included in the result or not. In this kind of approach the LINQ query structure stays the same.
Consider the following example:
Data class
Public Class MyItem
Public Property BoolValue As Boolean
Public Property TextValue As String
End Class
Extension method to decide if the item is included or not
Module ItemExtension
<System.Runtime.CompilerServices.Extension()>
Public Function IsValid(ByVal myItem As MyItem, textStart As String) As Boolean
IsValid = myItem.TextValue.StartsWith(textStart) And myItem.BoolValue = False
End Function
End Module
And a test run
Dim myList As List(Of MyItem) = New List(Of MyItem)
Dim myItem As MyItem
Dim resultList As System.Collections.Generic.IEnumerable(Of MyItem)
myItem = New MyItem
With myItem
.BoolValue = False
.TextValue = "First"
End With
myList.Add(myItem)
myItem = New MyItem
With myItem
.BoolValue = True
.TextValue = "Second"
End With
myList.Add(myItem)
resultList = From i In myList
Where i.IsValid("Fi") = True
Select i
So basically you could pass whatever parameters you like to the extension method and apply the changing logic inside of it.