2009-06-17 25 views
5

Giả sử rằng chúng ta có bảng sau:Nhiều Fields có điều kiện tìm kiếm và lọc trong LINQ

Person: 
    PersonID, 
    Name, 
    Age, 
    Gender 

Và chúng tôi đang cung cấp một chức năng tìm kiếm cho phép người dùng tìm kiếm bảng theo tên và/hoặc sự tuổi tác.

Phần khó khăn khi viết truy vấn SQL (hoặc LINQ) là người dùng có thể chọn tìm kiếm cả hai trường hoặc bất kỳ trường nào hoặc không có trường nào. Nếu anh ta muốn tìm kiếm tất cả thì anh ta chỉ cần để trống hộp văn bản.

Logic để làm điều này có thể được viết như sau:

Bây giờ sau một thời gian mã được rất dài và lộn xộn ... Làm thế nào tôi có thể nén ở trên vào một truy vấn duy nhất với không nếu -else?

Trả lời

4

Một thay thế mà tôi đã sử dụng trong SQL có thể được thực hiện trong LINQ quá là

var p = from p in Person 
     where p.Name == Name_TextBox || Name_TextBox == String.Empty 
     select p; 

(Lưu ý rằng 'LINQ' của bạn đang sử dụng cú pháp SQL, mà sẽ không biên dịch. Ngoài ra, bạn có thể không khai báo một var như bạn đang làm mà không trực tiếp gán một giá trị)

+0

Tôi đã cập nhật mã – Graviton

9

đang Cố gắng như thế này

 string personName = txtPersonName.Text; 
     int personAge = Convert.ToInt32(txtAge.Text); 
     var opportunites = from p in this.DataContext.Persons 
          select new 
          { 
           p.PersonID, 
           p.Name, 
           p.Age, 
           p.Gender 
          }; 

     if (personsID != 0) 
      opportunites = opportunites.Where(p => p.PersonID == personID); 

     if (personName != string.Empty) 
      opportunites = opportunites.Where(p => p.Name.StartsWith(personName)); 

     if (personAge != 0) 
      opportunites = opportunites.Where(p => p.Age == personAge); 

này sẽ hoạt động tốt. Nếu personName không được cho, nó sẽ không được thêm vào đâu, và nếu được cho thì nó sẽ được thêm vào.

+0

Đây là câu trả lời tốt hơn bằng cách xa. – Malcolm

+0

Đó là câu trả lời hay hơn vì tôi không chỉ định rằng tôi không muốn nếu người khác .. – Graviton

+1

Tôi phải thừa nhận rằng tôi nghĩ giải pháp này cũng sạch hơn, nhưng tôi đã lưu lựa chọn cuối cùng - theo cách đó bạn chỉ đang xây dựng lên truy vấn mà không thực hiện bất cứ điều gì (tôi tin?). Vì vậy, bắt đầu với var opportunities = Persons, sau đó thêm Where's and do Select ở cuối. Và công bằng, giải pháp này không sử dụng nếu-thì-người khác, nhưng chỉ nếu. – Benjol

2

tại sao không sử dụng toán tử kết hợp rỗng? ví dụ.

var products = from a in context.products where a.ID == (productID ?? a.ID) select a;

này hoạt động thực sự tốt trên hệ thống của tôi

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