Подтвердить что ты не робот

Как добавить предложение "where" с помощью VB.NET и 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, или если я делаю это правильно.

4b9b3361

Ответ 1

Я считаю, что именно так вы делаете это в VB (я разработчик С#):

query = query.where(Function(s) s = "ABC")

Для некоторых примеров см. LINQ - Примеры запросов.

Ответ 2

Я думаю, что сложная часть здесь - неизвестное количество параметров запроса. Вы можете использовать базовый 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() в конце для выполнения запроса.

Ответ 3

В 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 вашего запроса.

Ответ 4

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 

Ответ 5

Если вы сделаете это в цикле, вы можете сделать что-то вроде этого:

.Where(Function(i as mytype) i.myfiltervar = WhatIWantToSelect)