2014-12-03 14 views
6

Tôi có một biểu mẫu có nhiều tiêu chí tìm kiếm mà người dùng có thể sử dụng để tìm kiếm dữ liệu của nhân viên, ví dụ: FirstName, LastName, HireDate, Department, vvTuyên bố LINQ không liên quan với nhiều tiêu chí tìm kiếm

Tôi đang sử dụng LINQ và tôi tự hỏi tôi có thể sử dụng phương pháp nào để truy vấn tập hợp các nhân viên được cung cấp bất kỳ tiêu chí tìm kiếm nào, tức là người dùng không phải nhập tất cả, nhưng họ phải nhập ít nhất một trong các tham số tìm kiếm.

Cho đến nay, trong khi kiểm tra câu lệnh LINQ của tôi với hai tham số tìm kiếm tại chỗ, có vẻ như tôi phải xem tham số tìm kiếm có được nhập hay không. Nếu đây là trường hợp, sau đó điều này có thể nhận được khá khó sử dụng cho nhiều tham số tìm kiếm.

// only FirstName is entered 
if (!string.IsNullOrEmpty(FirstName) && string.IsNullOrEmpty(LastName)) 
{ 
    var employees = DB.Employees 
     .Where(emp => emp.FirstName.Contains(fName)); 
} 
// only LastName is entered 
else if (string.IsNullOrEmpty(FirstName) && !string.IsNullOrEmpty(LastName)) 
{ 
    var employees = DB.Employees 
     .Where(emp => emp.LastName.Contains(lName)); 
} 
// both parameters are entered 
else if (!string.IsNullOrEmpty(FirstName) && !string.IsNullOrEmpty(LastName)) 
{ 
    var employees = DB.Employees 
     .Where(emp => emp.FirstName.Contains(fName)) 
     .Where(emp => emp.LastName.Contains(lName)); 
} 

FYI, tôi ban đầu nghĩ rằng tôi chỉ có thể nối thêm ở đâu() báo cáo để tuyên bố LINQ của tôi với các thông số tìm kiếm thích hợp nhưng tôi nhận thấy rằng không phải tất cả hồ sơ đã được trả lại mà nên như vậy và logic trên của if- sau đó phát biểu.

+0

Bạn có thể nối nhiều câu lệnh LINQ nếu bạn đang làm việc với IQuery. Đây có phải là LINQ to Objects hay bạn đang sử dụng ORM để truy vấn cơ sở dữ liệu? – cost

+0

@cost - Lúc đầu, tôi không hiểu ý kiến ​​của bạn, nhưng sau khi nhìn thấy các câu trả lời được cung cấp, tôi tin rằng bạn là chính xác. Cảm ơn! –

Trả lời

6

gì về một cái gì đó như thế này:

IQueryable<Employee> employees = DB.Employees; 

if (!string.IsNullOrEmpty(FirstName)) 
{ 
    employees = employees 
     .Where(emp => emp.FirstName.Contains(fName)); 
} 
if (!string.IsNullOrEmpty(LastName)) 
{ 
    employees = employees 
     .Where(emp => emp.Last.Contains(lName)); 
} 
+0

Ahh! Nếu tôi hiểu logic của bạn, mỗi khi nó chuyển một câu lệnh "if", thì IQueryable ban đầu, các nhân viên, tiếp tục được nối thêm với các câu lệnh .Where(), đúng không? –

+0

@frenu một 'IQueryable' giống như một câu lệnh LINQ chưa được đánh giá. Cho đến khi bạn lặp qua truy vấn (như với '.ToList()'), chính truy vấn sẽ không được thực hiện.Vì vậy, bạn tiếp tục xây dựng các mệnh đề Where của bạn, và sau đó chúng sẽ được đánh giá và thực hiện khi bạn cuối cùng cố gắng lấy dữ liệu. – cost

+0

@cost: Cảm ơn bạn đã giải thích! –

4

Bạn có thể viết nó như thế này:

var employees = DB.Employees.AsQueryable(); 
if (!string.IsNullOrEmpty(fName) 
    employees = employees.Where(emp => emp.FirstName.Contains(fName)); 

if (!string.IsNullOrEmpty(lName) 
    employees = employees.Where(emp => emp.LastName.Contains(lName)); 
+0

Bạn không cần khai báo 'nhân viên' một cách rõ ràng là' IQueryable'? – cost

+0

@cost, vâng hoàn toàn đúng, cảm ơn. – Magnus

1

tôi gặp phải một thách thức tương tự mà người dùng có thể chọn 0, 1 hoặc nhiều giá trị trong khoảng 10 các trường có thể tìm kiếm và cần thiết để tạo truy vấn đó khi chạy.

tôi đã kết thúc bằng LINQKit: http://www.albahari.com/nutshell/linqkit.aspx

Đặc biệt tôi đã sử dụng nó builder ngữ, được mô tả ở đây: http://www.albahari.com/nutshell/predicatebuilder.aspx

Trong ví dụ của bạn ở trên, bạn đã bao trùm các nhiều truy vấn trong câu lệnh if . Cách khác là xây dựng truy vấn khi bạn đi.

Nếu bạn khai báo var employees = DB.Employees bên ngoài các câu lệnh if (Giả sử rằng nó luôn luôn có liên quan), thì bạn có thể chỉ trích các câu lệnh where trong câu lệnh if nếu có.

LINQ cung cấp cho bạn thực thi hoãn lại, vì vậy bạn không phải có toàn bộ biểu thức trong một khối (Mặc dù bạn cảm thấy tự nhiên nhất khi làm như vậy và trong nhiều trường hợp bạn sẽ làm).

Mọi thứ trở nên phức tạp hơn một chút nếu bạn muốn kết hợp trong HOẶC với AND, nhưng đó là nơi xây dựng vị đã đề cập đến.

Đáng tiếc là tôi không có bất kỳ ví dụ để chia sẻ, nhưng các liên kết nên giúp bạn có một khởi đầu tốt.

+0

Tôi thực sự có 5.0 cuốn sách Albahari và là khách hàng của LINQPad. Tôi thậm chí còn không nghĩ về LINQKit, nhưng một điều tôi chắc chắn đang xem xét vào lúc này. Cảm ơn! –

0
var resultData = (from data in db.Abc 
        where !string.IsNullOrEmpty(firstName) ? data.FirstName == firstName : true 
&& data.UserType == userTypeValue 
&& !string.IsNullOrEmpty(lastName) ? data.LastName == lastName : true 
&& !string.IsNullOrEmpty(gender) ? data.Gender == gender : true 
&& !string.IsNullOrEmpty(phone) ? data.CellPhone == phone : true 
&& !string.IsNullOrEmpty(fax) ? data.Fax == fax : true 
&& !string.IsNullOrEmpty(emailAddress) ? data.Email == emailAddress : true 
&& !string.IsNullOrEmpty(address1) ? data.Address == address1 : true 
           select new 
           { 
            UserName = data.UserName, 
            FirstName = data.FirstName, 
            Address = data.Address, 
            CellPhone = data.CellPhone, 
            Fax = data.Fax, 
            Email = data.Email 
           }).ToList(); 
+0

Bạn có thể sử dụng mã này, Nếu bạn muốn tìm kiếm Các mục dựa trên nhiều điều kiện tìm kiếm –

+0

Xin chào Ramu cảm ơn sự đóng góp của bạn. sẽ tốt hơn nếu bạn thêm con trỏ và nhận xét để giải thích tại sao mã này sẽ hoạt động để giải quyết vấn đề này. – NSNoob

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