如何使用VB.NET和LINQ附加'where'子句?

时间:2009-04-23 16:41:33

标签: vb.net linq where-clause

我对VB.NET很陌生,在这里遇到一些我认为应该很简单的问题。

保持简单,假设我有一个带有“Name”的Document表,我想搜索(实际上还有其他几个表,连接等等)。我需要能够基于传入的字符串值使用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 个答案:

答案 0 :(得分:39)

我相信这就是你在VB中做的事情(我是C#开发人员):

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

有关示例,请参阅 LINQ - Sample Queries

答案 1 :(得分:10)

我认为这里棘手的部分是未知数量的查询参数。您可以在此处使用基础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()来执行查询。

答案 2 :(得分:3)

在LINQ to SQL中,您可以使用查询对象的.Where方法向查询添加WHERE子句,如您在问题中所述。要使用LIKE运算符,请尝试使用您在Where方法调用的Lambda表达式中查询的对象的.Contains方法。

这是控制台应用程序中的简化示例。希望它会引导你走向正确的方向。

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

注意.Where方法的Lambda表达式中的.Contains(“GHI”)调用。我正在引用表达式“d”的参数,它暴露了DocName属性,进一步暴露了.Contains方法。这应该产生你期望的LIKE查询。

此方法是附加的,即对.Where方法的调用可以包含在循环中,以便将其他LIKE运算符添加到查询的WHERE子句中。

答案 3 :(得分:1)

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 

答案 4 :(得分:0)

如果你在循环中执行此操作,则可以执行以下操作:

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