2009-04-23 33 views
23

Tôi khá mới với VB.NET và có một chút rắc rối ở đây với một cái gì đó tôi nghĩ nên đơn giản.Làm cách nào để nối thêm mệnh đề 'where' bằng VB.NET và LINQ?

Giữ đơn giản, giả sử tôi có bảng Tài liệu với "Tên" mà tôi muốn tìm kiếm (trong thực tế có một số bảng khác, kết nối, v.v.). Tôi cần để có thể xây dựng truy vấn sử dụng mệnh đề where dựa trên giá trị chuỗi được truyền.

Ví dụ - người dùng có thể chuyển vào "ABC", "ABC DEF", "ABC DEF GHI".

Truy vấn cuối cùng sẽ là (cú pháp là không đúng, tôi biết):

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

Vì vậy, tôi nghĩ tôi có thể làm một cái gì đó như thế này.

Dim query = From document In _context.Documents 

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

Vì lý do nào đó, bị chết não hoặc điều gì đó, tôi không thể tìm ra cách thực hiện công việc này trong VB.NET hoặc nếu tôi làm đúng.

Trả lời

1
Dim query = From document In _context.Documents where document.name = 'xpto' select document 

Hoặc

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

Tôi tin rằng đây là cách bạn sẽ làm điều đó trong VB (Tôi là một nhà phát triển C#):

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

Xem LINQ - Sample Queries cho một số ví dụ.

+2

Toán tử so sánh của VB giống với toán tử gán của nó .. vì vậy 's == "ABC"' phải là '("ABC" = s)'. Khác hơn rồi làm tốt lắm. –

+0

Không, đó không phải LINQ, đó là một Lambda. –

+7

Thực ra, đó là cả hai. Đây là một ví dụ về cú pháp phương pháp LINQ sử dụng một biểu thức Lamda. –

0

Nếu bạn làm điều này trong một vòng lặp, bạn có thể làm một cái gì đó như thế này:

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

Tôi nghĩ rằng phần khó hiểu ở đây là số không rõ của tham số truy vấn. Bạn có thể sử dụng LINQ IQueryable (Of T) cơ bản ở đây để trợ giúp.

Tôi nghĩ rằng những điều sau đây sẽ làm việc (nó không được biên dịch, chỉ là mã notepad đây):

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 

Kể từ LINQ sẽ trì hoãn-thực hiện truy vấn bạn có thể thêm nơi khoản vào truy vấn của bạn trong vòng lặp và sau đó gọi .ToList() ở cuối để thực hiện truy vấn.

3

Trong LINQ to SQL, bạn có thể thêm mệnh đề WHERE vào truy vấn của mình bằng cách sử dụng phương thức .Where của đối tượng truy vấn, như bạn đã lưu ý trong câu hỏi của mình. Để sử dụng toán tử LIKE, hãy thử sử dụng phương thức .Contains của đối tượng mà bạn đang truy vấn trong biểu thức Lambda của lời gọi của bạn đến phương thức Where.

Dưới đây là một ví dụ đơn giản trong ứng dụng bảng điều khiển. Hy vọng nó sẽ dẫn bạn đi đúng hướng.

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 

Lưu ý cuộc gọi .Contains ("GHI") trong biểu thức Lambda của phương thức .Where. Tôi đang tham chiếu tham số của biểu thức, "d", hiển thị thuộc tính DocName, tiếp tục hiển thị phương thức .Contains. Điều này sẽ tạo ra truy vấn LIKE bạn mong đợi.

Phương pháp này là phụ gia, tức là lệnh gọi phương thức .Where có thể được đặt trong vòng lặp để thêm các toán tử LIKE bổ sung vào mệnh đề WHERE của truy vấn của bạn.

Các vấn đề liên quan