2012-03-19 30 views
6

Tôi đang cố triển khai chức năng tìm kiếm trong ứng dụng ASP.NET MVC 2. Tôi tạo ra một biểu thức dựa trên các tiêu chí nhập vào bởi người sử dụng:Toán tử điều kiện trong Biểu thức LINQ gây ra ngoại lệ NHibernate

public ViewResult FindCustomer(string forename, string familyname, DateTime? dob) 
    { 
    Expression<Func<Customer, bool>> searchCriteria = p => (
                  forename.IsNullOrEmpty() ? true : p.Forename == forename 
                  && familyname.IsNullOrEmpty() ? true : p.FamilyNames.Any(n => n.Name == familyname) 
                  && dob.HasValue ? true : p.DOB == dob 
                  ); 

mà sau đó được thông qua một phương pháp trong kho

IQueryable<Customer> customers = CustomerRepository.FilterBy(searchCriteria); 

Vấn đề là khi tôi chạy này tôi nhận được ngoại lệ sau đây

System.InvalidCastException: Unable to cast object of type 'NHibernate.Hql.Ast.HqlCast' to type 'NHibernate.Hql.Ast.HqlBooleanExpression' 

Theo this sự cố là việc sử dụng toán tử điều kiện trong biểu thức.

Vì vậy, tôi cho rằng tôi phải tạo Biểu thức theo một cách khác nhưng tôi không chắc chắn cách thực hiện điều đó. Tôi khá mới với Linq nên mọi sự giúp đỡ sẽ được chấp nhận một cách biết ơn!

Trả lời

9

Điều gì tạo động truy vấn của bạn? Như thế này:

var customers = CustomerRepository.AllEntities(); 

if (!forename.IsNullOrEmpty()) 
    customers = customers.Where(p => p.Forename == forename); 
if (!familyname.IsNullOrEmpty()) 
    customers = customers.Where(p => p.FamilyNames.Any(n => n.Name==familyname)); 
if (dob.HasValue) 
    customers = customers.Where(p => p.DOB == dob); 

Tôi không biết điều này có hiệu quả không nhưng tôi nghĩ điều này có thể hiệu quả hơn.

+0

Điều đó có hiệu quả! Cảm ơn rất nhiều. Tôi đã cố gắng để tránh viết một cái gì đó như thế bởi vì tôi muốn tránh nhiều cuộc gọi đến cơ sở dữ liệu vì vậy tôi nghĩ rằng tôi cần thiết để xây dựng một biểu thức duy nhất có chứa tất cả các tham số. Sử dụng giải pháp của bạn chỉ thực thi một câu lệnh SQL đơn. Đó có phải là một tính năng của NHibernate? Nó xây dựng một câu lệnh SQL từ nhiều biểu thức LINQ để giảm thiểu các cuộc gọi đến cơ sở dữ liệu? Tôi nghĩ rằng tôi cần phải tìm hiểu thêm về cả NHibernate và LINQ! – Babakoto

+1

@Babakoto Đây là một tính năng của LINQ. Truy vấn của bạn sẽ không được đánh giá cho đến khi bạn gọi phương thức 'ToList' hoặc' SingleOrDefault' (hoặc tương tự) ở cuối chuỗi 'IQueryable' của bạn, do đó bạn có thể tự động thêm bất kỳ bộ lọc nào vào truy vấn của mình. Sau khi một cuộc gọi rõ ràng bộ xử lý truy vấn (như NHibernate) sẽ chuyển đổi toàn bộ chuỗi truy vấn thành một biểu thức SQL. –

+0

Thật tuyệt vời. Một lần nữa xin cảm ơn sự giúp đỡ của bạn – Babakoto

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