我对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中完成这项工作,或者我是否正确地做了这件事。
答案 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)