38 Stimmen

Wie füge ich eine "Where"-Klausel mit VB.NET und LINQ an?

Ich bin ziemlich neu in VB.NET und habe hier ein paar Probleme mit etwas, von dem ich dachte, dass es einfach sein sollte.

Um es einfach zu halten, sagen wir, ich habe eine Dokumententabelle mit "Name", die ich durchsuchen möchte (in Wirklichkeit gibt es mehrere andere Tabellen, Joins usw.). Ich muss in der Lage sein, die Abfrage mit einer where Klausel auf der Grundlage der übergebenen Zeichenkettenwerte.

Beispiel - der Benutzer kann "ABC", "ABC DEF", "ABC DEF GHI" eingeben.

Die endgültige Abfrage würde lauten (die Syntax ist nicht korrekt, ich weiß):

Select * from Documents Where Name Like %ABC% AND Name Like %DEF% AND Name like %GHI%

Also dachte ich, ich könnte so etwas machen.

Dim query = From document In _context.Documents

<< loop based on number of strings passed in >>
query = query.Where( ... what goes here?? )

Aus irgendeinem Grund, wobei hirntot oder etwas, ich kann nicht herausfinden, wie man diese Arbeit in VB.NET, oder wenn ich es richtig tun.

67voto

Jimmie R. Houts Punkte 7358

Ich glaube, so würden Sie es in VB machen (ich bin ein C#-Entwickler):

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

Siehe LINQ - Beispielabfragen für einige Beispiele.

11voto

Jeremy Wiebe Punkte 3859

Ich denke, der schwierige Teil hier ist die unbekannte Anzahl von Abfrageparametern. Sie können die zugrunde liegende LINQ IQueryable(Of T) hier zu helfen.

Ich denke, die folgende würde funktionieren (es ist nicht kompiliert, nur Notepad-Code hier):

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

Da LINQ die Ausführung der Abfrage verzögert, können Sie in der Schleife Where-Klauseln an Ihre Abfrage anhängen und dann am Ende .ToList() aufrufen, um die Abfrage auszuführen.

3voto

Bob Mc Punkte 1920

In LINQ to SQL können Sie WHERE-Klauseln zu Ihrer Abfrage hinzufügen, indem Sie die Methode .Where des Abfrageobjekts verwenden, wie Sie in Ihrer Frage erwähnt haben. Um den LIKE-Operator zu verwenden, versuchen Sie, die .Contains-Methode des Objekts, das Sie abfragen, im Lambda-Ausdruck Ihres Aufrufs der Where-Methode zu verwenden.

Hier ist ein vereinfachtes Beispiel in einer Konsolenanwendung. Hoffentlich führt es Sie in die richtige Richtung.

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

Beachten Sie den Aufruf .Contains("GHI") im Lambda-Ausdruck der Methode .Where. Ich verweise auf den Parameter des Ausdrucks, "d", der die DocName-Eigenschaft offenlegt, die wiederum die .Contains-Methode offenlegt. Dies sollte die von Ihnen erwartete LIKE-Abfrage ergeben.

Diese Methode ist additiv, d.h. der Aufruf der Methode .Where kann in eine Schleife eingeschlossen werden, um weitere LIKE-Operatoren zur WHERE-Klausel Ihrer Abfrage hinzuzufügen.

1voto

Sergio Punkte 7951
Dim query = From document In _context.Documents where document.name = 'xpto' select document 

Oder

Dim query = From document In _context.Documents where document.name.contains('xpto') select document

0voto

TheCodeMonk Punkte 1609

Wenn Sie dies in einer Schleife tun, können Sie etwa so vorgehen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X