2013-05-08 29 views
6

Tôi muốn viết một phương pháp để truy vấn bảng với một phương pháp mà theo thông số cheking rỗng sử dụng SqlExpressionVisitor của Ormlite Đây là phương pháp của tôi:ServiceStack Ormlite SqlExpressionVisitor vô check in ở đâu mở rộng

public static List<UserChatsDTO> GetUserChats(int startRow, int rowCount, DateTime? startDate, DateTime? endDate, string operatorName, short? rating, string visitorName) 
     { 
      using (IDbConnection db = DbFactory.OpenDbConnection()) 
      { 
       SqlExpressionVisitor<UserChatsDTO> ev = OrmLiteConfig.DialectProvider.ExpressionVisitor<UserChatsDTO>(); 
       ev.Where(q => 
        (startDate.HasValue && q.Dated >= startDate) && 
        (endDate.HasValue && q.Dated <= endDate) && 
        (!string.IsNullOrEmpty(operatorName) && q.TakenByUser.Contains(operatorName)) && 
        (rating.HasValue && q.Rating == (short)rating) && 
        (!string.IsNullOrEmpty(visitorName) && q.VisitorName.Contains(visitorName))); 
       //ev.OrderBy(); 
       ev.Limit(startRow, rowCount); 
       return db.Select<UserChatsDTO>(ev); 
      } 
     } 

Nhưng đối tượng tham chiếu không được thiết lập đến một thể hiện của một đối tượng. NullReferenceException được ném khi tôi gọi ev.Where một phần.

Có lỗi ở đây hoặc tôi đang thiếu gì đó không? Cảm ơn bạn.

Trả lời

5

Bạn thực sự có thể xây dựng các ExpressionVisitor bên trong Chọn phương pháp như vậy:

var chats = db.Select<UserChatsDTO>(q => q 
    .Where(x => startDate.HasValue && x.Date >= startDate) 
    .Where(x => endDate.HasValue && x.Date <= endDate) 
    .Where(x => string.IsNullOrEmpty(operatorName) || x.TakeByUser.Contains(operatorName)) 
    .Where(x => rating.HasValue && x.Rating == (short)rating) 
    .Where(x => string.IsNullOrEmpty(visitorName) || x.VisitorName.Contains(visitorName) 
    .Limit(startRow, rowCount)); 
+0

Tôi vẫn nhận được một NullReferenceException với phương pháp này là tốt. Tôi đã thêm một giải pháp làm việc. –

3

Tôi biết câu hỏi này là 7 tháng tuổi nhưng tôi đã có một vấn đề tương tự & đây là câu hỏi đầu tiên đập vào mắt mình khi tôi đã tìm kiếm. Tôi muốn thêm giải pháp làm việc của mình vì Master Morality không làm việc cho tôi.

Ban đầu, tôi đã thử cú pháp gần giống với nỗ lực đầu tiên của mustafasturan. Tôi có cùng NullReferenceException anh ta đã làm. Câu trả lời của Đạo đức Chính thống cũng không giúp được ...

Tôi đang cố gắng xây dựng chức năng tìm kiếm thực hiện tìm kiếm LIKE thay vì đối sánh chính xác. Có nhiều tiêu chí về đối tượng yêu cầu có thể hoặc không được rỗng (vì lợi ích đơn giản, chúng tôi sẽ sử dụng một ví dụ với 2 tiêu chí). Theo gợi ý của Đạo Đức Sư Phụ, tôi đã thử điều này:

var searchResults = db.Select<Item>(q => q 
     .Where(x => string.IsNullOrWhiteSpace(request.Criteria1) || x.Criteria1.Contains(request.Criteria1)) 
     .Where(x => string.IsNullOrWhiteSpace(request.Criteria2) || x.Criteria2.Contains(request.Criteria2)) 
    ); 

Tôi vẫn còn một NullReferenceException. Có vẻ như & & và || các toán tử không sử dụng đánh giá ngắn mạch bên trong biểu thức lambda.

gì cuối cùng tôi đã phải đi với là thế này:

SqlExpressionVisitor<Item> ev = new ServiceStack.OrmLite.MySql.MySqlExpressionVisitor<Item>(); 

if (!String.IsNullOrWhiteSpace(request.Criteria1)) { 
    ev.Where(q => q.Criteria1.Contains(request.Criteria1)); 
} 
if (!String.IsNullOrWhiteSpace(request.Criteria2)) { 
    ev.Where(q => q.Criteria2.Contains(request.Criteria2)); 
} 

searchResults = db.Select<Item>(ev); 

Nó không cảm thấy rất thanh lịch, nhưng đó là điều duy nhất tôi có thể thấy rằng hoạt động.

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