32

我对 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 中进行这项工作,或者我是否做得正确。

4

5 回答 5

56

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

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

有关一些示例,请参阅LINQ - 示例查询

于 2009-04-23T17:04:34.210 回答
11

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

于 2009-04-23T22:38:58.463 回答
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 子句中。

于 2009-05-13T17:02:51.163 回答
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 
于 2009-04-23T16:43:23.357 回答
0

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

.Where(Function(i as mytype) i.myfiltervar = WhatIWantToSelect)
于 2009-04-23T17:05:55.220 回答