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

sug*_*rum 28 linq vb.net 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%
Run Code Online (Sandbox Code Playgroud)

所以,我以为我可以这样做.

Dim query = From document In _context.Documents

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

出于某种原因,脑死亡或其他什么,我无法弄清楚如何在VB.NET中完成这项工作,或者我是否正确地做到了.

Jim*_*uts 42

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

query = query.where(Function(s) s = "ABC")
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,两者都是.这是使用Lamda Expression的LINQ方法语法的示例. (7认同)
  • VB的比较运算符与它的赋值运算符相同.所以's =="ABC"'应该是'("ABC"= s)'.除此之外,干得好. (2认同)

Jer*_*ebe 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
Run Code Online (Sandbox Code Playgroud)

由于LINQ将延迟执行查询,您可以在循环中将where子句附加到查询中,然后在末尾调用.ToList()来执行查询.


Ser*_*gio 1

Dim query = From document In _context.Documents where document.name = 'xpto' select document 
Run Code Online (Sandbox Code Playgroud)

或者

Dim query = From document In _context.Documents where document.name.contains('xpto') select document 
Run Code Online (Sandbox Code Playgroud)