2010-10-19 39 views
9

Vì vậy, tôi có một mô hình được tạo trong Entity Framework 4 sử dụng các tính năng đầu tiên của mã CTP4. Đây là tất cả làm việc tốt với nhau.Mã khung thực thể Đầu tiên & Tiêu chí tìm kiếm

Tôi đang cố gắng thêm tính năng tìm kiếm nâng cao vào ứng dụng của mình. Tính năng "tìm kiếm nâng cao" này chỉ cho phép người dùng nhập nhiều tiêu chí để tìm kiếm theo. Ví dụ: Tìm

nâng cao sản phẩm

  • Tên
  • Ngày bắt đầu
  • Ngày Kết Thúc

Điều này sẽ cho phép người dùng tìm kiếm theo tên sản phẩm và cũng có thể hạn chế kết quả theo ngày chúng được tạo.

Vấn đề là tôi không biết có bao nhiêu trường này sẽ được sử dụng trong bất kỳ tìm kiếm nào. Làm thế nào sau đó có thể truy vấn khung Entity Framework của tôi được xây dựng?

Tôi có an example mô tả cách tạo truy vấn động cho khung thực thể, tuy nhiên điều này dường như không hoạt động đối với các lớp POCO mà tôi đã tạo cho sự kiên trì Code First.

Cách tốt nhất để xây dựng truy vấn khi số lượng các ràng buộc không xác định là gì?

Trả lời

20

Vì vậy, sau một vài giờ làm việc về vấn đề này (và một số trợ giúp từ bạn Google của chúng tôi), tôi đã tìm được giải pháp khả thi cho vấn đề của mình. Tôi tạo ra tiện ích sau LINQ biểu:

using System; 
using System.Linq; 
using System.Linq.Expressions; 

namespace MyCompany.MyApplication 
{ 
    public static class LinqExtensions 
    { 
     public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) 
     { 
      if (condition) 
       return source.Where(predicate); 
      else 
       return source; 
     } 
    } 
} 

Phần mở rộng này cho phép cho một truy vấn LINQ to được tạo ra như thế này:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name) 
           .WhereIf(startDate != null, p => p.CreatedDate >= startDate) 
           .WhereIf(endDate != null, p => p.CreatedDate <= endDate); 

này cho phép mỗi câu lệnh WhereIf để chỉ ảnh hưởng đến kết quả nếu nó đáp ứng các quy định điều kiện. Giải pháp dường như hoạt động, nhưng tôi luôn mở ra những ý tưởng mới và/hoặc phê bình mang tính xây dựng.

+0

Tuyệt vời! Cảm ơn! –

+0

+1 Một chút mã rất hữu ích. –

+0

chúng ta có thể sử dụng trong-buil ở đâu(). Where() nhưng tại sao một số người sử dụng phần mở rộng của bạn? có gì đặc biệt ở đó? –

0

John,

Giải pháp của bạn tuyệt đối tuyệt vời! Nhưng, chỉ để chia sẻ, tôi đã sử dụng phương pháp này ở trên cho đến khi tôi thấy sự thành tâm của bạn.

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword)); 

Vì vậy, có vẻ như đó không phải là giải pháp tốt nhất cho điều này, nhưng chắc chắn đó là một cách xung quanh.

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