Как добавить предложение 'where', используя VB.NET и LINQ? - PullRequest
25 голосов
/ 23 апреля 2009

Я довольно новичок в 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 или правильно ли я делаю.

Ответы [ 5 ]

39 голосов
/ 23 апреля 2009

Я полагаю, что именно так вы бы поступили в VB (я разработчик на C #):

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

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

10 голосов
/ 24 апреля 2009

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

3 голосов
/ 13 мая 2009

В LINQ to SQL вы можете добавлять предложения WHERE к вашему запросу, используя метод .Where объекта запроса, как вы отметили в своем вопросе. Чтобы использовать оператор LIKE, попробуйте использовать метод .Contains объекта, к которому вы обращаетесь, в лямбда-выражении вашего вызова метода 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") в лямбда-выражении метода .Where. Я ссылаюсь на параметр выражения "d", который предоставляет свойство DocName, которое дополнительно предоставляет метод .Contains. Это должно привести к ожидаемому запросу LIKE.

Этот метод является аддитивным, то есть вызов метода .Where может быть заключен в цикл, чтобы добавить дополнительные операторы LIKE в предложение WHERE вашего запроса.

1 голос
/ 23 апреля 2009
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 
0 голосов
/ 23 апреля 2009

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

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