Ответ 1
Я считаю, что именно так вы делаете это в VB (я разработчик С#):
query = query.where(Function(s) s = "ABC")
Для некоторых примеров см. LINQ - Примеры запросов.
Я новичок в VB.NET, и у меня здесь немного проблем с чем-то, что я думал, должно быть просто.
Сохраняя это просто, скажем, у меня есть таблица документов с "именем", которую я хочу найти (на самом деле есть несколько других таблиц, объединений и т.д.). Мне нужно построить запрос, используя предложение where
, основанное на строковых значениях, переданных в.
Пример - пользователь может перейти в "ABC", "ABC DEF", "ABC DEF GHI".
Последний запрос будет (я знаю, синтаксис неверен):
Select * from Documents Where Name Like %ABC% AND Name Like %DEF% AND Name like %GHI%
Итак, я думал, что смогу сделать что-то вроде этого.
Dim query = From document In _context.Documents
<< loop based on number of strings passed in >>
query = query.Where( ... what goes here?? )
По какой-то причине, будучи мертвым мозгом или чем-то еще, я не могу понять, как сделать эту работу в VB.NET, или если я делаю это правильно.
Я считаю, что именно так вы делаете это в VB (я разработчик С#):
query = query.where(Function(s) s = "ABC")
Для некоторых примеров см. LINQ - Примеры запросов.
Я думаю, что сложная часть здесь - неизвестное количество параметров запроса. Вы можете использовать базовый LINQ IQueryable (Of T) здесь, чтобы помочь.
Я думаю, что следующее будет работать (оно не скомпилировано, просто блокнот здесь):
Public Function GetDocuments(criteria as String)
Dim splitCriteria = SplitTheCriteria(criteria)
dim query = from document in _context.Documents
For Each item in splitCriteria
Dim localItem = item
query = AddCriteriaToQuery(query, localItem)
Next
dim matchingDocuments = query.ToList()
End Function
Private Function AddCriteriaToQuery(query as IQueryable(Of Document), criteria as string) as IQueryable(Of Document)
return query.Where(Function(doc) doc.Name = criteria)
End Function
Так как LINQ будет задерживать - выполните запрос, который вы можете добавить, где предложения на ваш запрос в цикле, а затем вызовите .ToList() в конце для выполнения запроса.
В LINQ to SQL вы можете добавить предложения WHERE к вашему запросу с использованием метода Where метода запроса, как вы отметили в своем вопросе. Чтобы использовать оператор LIKE, попробуйте использовать метод .Contains объекта, который вы запрашиваете в выражении Lambda вашего вызова, методу Where.
Здесь приведен упрощенный пример в консольном приложении. Надеемся, что это приведет вас в правильном направлении.
Public Class Doc
Private _docName As String
Public Property DocName() As String
Get
Return _docName
End Get
Set(ByVal value As String)
_docName = value
End Set
End Property
Public Sub New(ByVal newDocName As String)
_docName = newDocName
End Sub
End Class
Sub Main()
Dim Documents As New List(Of Doc)
Documents.Add(New Doc("ABC"))
Documents.Add(New Doc("DEF"))
Documents.Add(New Doc("GHI"))
Documents.Add(New Doc("ABC DEF"))
Documents.Add(New Doc("DEF GHI"))
Documents.Add(New Doc("GHI LMN"))
Dim qry = From docs In Documents
qry = qry.Where(Function(d) d.DocName.Contains("GHI"))
Dim qryResults As List(Of Doc) = qry.ToList()
For Each d As Doc In qryResults
Console.WriteLine(d.DocName)
Next
End Sub
Обратите внимание на вызов .Contains( "GHI" ) в выражении Lambda метода Where. Я ссылаюсь на параметр выражения "d", который предоставляет свойство DocName, которое также предоставляет метод .Contains. Это должно вызвать запрос LIKE, который вы ожидаете.
Этот метод является аддитивным, то есть вызовом метода .Where может быть заключен в цикл, чтобы дополнительные операторы LIKE были добавлены в предложение WHERE вашего запроса.
Dim query = From document In _context.Documents where document.name = 'xpto' select document
или
Dim query = From document In _context.Documents where document.name.contains('xpto') select document
Если вы сделаете это в цикле, вы можете сделать что-то вроде этого:
.Where(Function(i as mytype) i.myfiltervar = WhatIWantToSelect)