2012-04-18 33 views
11

Tôi hiện đang viết hàm tìm kiếm trong ASP.NET MVC 4 với Entity Framework. Tuy nhiên, tôi đã gặp phải một rào cản mà tôi chỉ có thể tìm thấy các giải pháp "xấu".LINQ to sql query với nhiều tham số

chức năng tìm kiếm của tôi sẽ trở lại một mô hình trong đó bao gồm 4 thông số:

String Name 
String Street 
String Code 
String Province 

List<Query> query = (from t in Model select t).ToList(); 

Bây giờ tôi muốn lọc vào đầu vào tìm kiếm của tôi. Tuy nhiên, người dùng có thể quyết định điền vào nhiều trường tìm kiếm nhất có thể. Anh ta có thể quyết định sử dụng Tên và Đường, hoặc Tên, Đường và Tỉnh, hoặc ...

Giải pháp thực sự duy nhất tôi có thể tìm được bao gồm truy vấn và IQueryable và kiểm tra xem trường có được điền hay không với số if, sau đó sử dụng .Where để cập nhật truy vấn. Vì điều này hiện tại sẽ cung cấp cho các truy vấn m5, tôi tự hỏi liệu có một giải pháp tốt hơn mà tôi đang thiếu ở đây hay không.

Cảm ơn vì đã giúp tôi.

Trả lời

22

Nếu tôi hiểu chính xác. Bạn có thể muốn một cái gì đó như thế này:

string Name; 
string Street; 
string Code; 
string Province; 
var query=(from t in Model select t); 
if(Name!=null) 
{ 
    query=query.Where (q =>q.Name==Name); 
} 
if(Street!=null) 
{ 
    query=query.Where (q =>q.Street==Street); 
} 
if(Code!=null) 
{ 
    query=query.Where (q =>q.Code==Code); 
} 
if(Province!=null) 
{ 
    query=query.Where (q =>q.Province==Province); 
} 
List<Query> ls = query.ToList(); 

Bạn sẽ có một IQueryable khi bạn thêm các nơi báo cáo và khi bạn làm ToList() rằng SQL sẽ thực hiện.

Cập nhật

Để trả lời bình luận của Luis Hernández. Đây là cách nó hoạt động. Khi bạn chọn từ mô hình trong trường hợp này, loại bộ sưu tập là IQueryable. Điều này có nghĩa rằng nó đã không được thực hiện đối với cơ sở dữ liệu. Để truy vấn thực hiện, bạn cần áp dụng một số metod cuối cùng. Để nói với linq rằng nó sẽ thực sự thực hiện cuộc gọi cơ sở dữ liệu. Đây là ví dụ:

ToList() 
FirstOrDefault() 
SingleOrDefault() 
Single() 
First() 
ToDictionary() 

Vì vậy, khi chúng tôi gắn điều khoản Where mà không sử dụng ToList(). Không có thực hiện truy vấn.

Vui lòng thử truy vấn trong LinqPad

+0

Vâng, đó là giải pháp tôi tìm thấy trực tuyến. Tôi đã tự hỏi có hay không có một cách sạch hơn để mã này. – whodares

+0

Nếu bạn muốn ở lại 'IQueryable'. Sau đó, đây là những gì tôi nghĩ rằng cách để làm điều đó – Arion

+0

Có thể có nhiều mã, nhưng điều này được tối ưu hóa nhất (và có lẽ là tốt nhất). Kiểm tra truy vấn SQL kết quả trong [linqpad] (http://www.linqpad.net/) – mshsayem

0

Bạn casn thử một số điều như thế này

from cars in tblCars 
where (cars.colorID == 1) && (cars.Wieght > 500) && (cars.Active == true) 
select cars; 
2

Sử dụng lớp lọc Entity bạn tìm thấy ở đây: https://servicelayerhelpers.codeplex.com/SourceControl/changeset/view/32810#537055

vì vậy đầu tiên xác định bộ lọc của bạn và sau đó chỉ áp dụng nó cho truy vấn của bạn.

Ví dụ:

var filter = EntityFilter 
.Where(c => c.Name == came) 
.Where(c => c.City == city); 

var customers = FindCustomers(filter); 

Customer[] FindCustomers(IEntityFilter filter) 
{ 
var query = context.Customers; 
query = filter.Filter(query); 
return query.ToArray(); 
} 

chi tiết về: https://cuttingedge.it/blogs/steven/pivot/entry.php?id=66

0

giải pháp Arion là tất nhiên rất tốt, tôi đã cố gắng để làm cho nó một chút ít lặp đi lặp lại sử dụng phản chiếu, hy vọng nó sẽ giúp.

 Type myType = myObject.GetType(); 
     IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

     foreach (PropertyInfo prop in props) 
     { 
      object propValue = prop.GetValue(myObject, null); 
      if (propValue != null) 
      { 
       query = query.Where(q => prop.GetValue(q, null) == propValue); 
      } 
     } 

EDIT:

tôi đã chỉnh sửa nó hoạt động trên tất cả các tài sản. tất nhiên bạn vẫn cần một số thứ để làm việc này, nhưng một khi bạn hiểu cách làm việc với nó, bạn có thể sử dụng nó như một tiện ích cho tất cả mã của bạn, thay vì mã hóa nó cho mọi loại

+0

Cảm ơn bạn đã trả lời, nhưng điều này chỉ hoạt động với giá trị Tên mà bạn đã chỉ định. Vì tôi cũng có 3 giá trị khác, tôi không thấy nó hoạt động như thế nào. – whodares