2009-07-03 24 views
12

Tại sao LINQ đang cố kiểm tra biểu thức thứ hai?Tại sao không phải là ngắn mạch trong lambda làm việc?

.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring)) 

Giải pháp thông thường là gì?

Cập nhật:
Đó là về LINQ to SQL, tất nhiên. Nó không thể dịch sang SQL.

+0

Đây có phải là LINQ to SQL không? – SLaks

+2

Tôi đột nhiên tìm thấy => và> = trong mã này rất khó hiểu. :-) (Và tôi đã sử dụng cả hai khá thường xuyên, nhưng không bao giờ cùng nhau trong cùng một tuyên bố.) –

+0

có. tốt, cảm ơn, tôi đã nhận nó :) – rudnev

Trả lời

11

Có phải .Where đang được sử dụng trên Table<> không?

Nếu có, thì trước khi bất kỳ dữ liệu nào có thể được nắm bắt, nó phải chuyển đổi LINQ thành SQL và để làm điều đó, nó phải chuyển đổi string thành decimal. Nó không cố gắng thực sự so sánh được, nó đang cố gắng xây dựng các cấu trúc cần thiết để lấy dữ liệu.

-1

Điều này có hữu ích không?

.Where(t => String.IsNullOrEmpty(someNullString) || (t.SomeProperty >= Convert.ToDecimal(someNullstring))) 

Nhận thấy() xung quanh điều kiện thứ hai? Tôi không nghĩ rằng nó hoạt động nhưng nói chung tôi thích đặt() xung quanh mọi điều kiện trong mã của tôi. Bằng cách đó, trình biên dịch biết phần nào thuộc về nhau khi nó biên dịch mã, để chuẩn bị cho đánh giá ngắn mạch ...

-1

tôi không thể tái tạo bất kỳ vấn đề với ngắn mạch đánh giá ...

tôi nghĩ rằng đây để đánh giá cái gì đó như:

[CompilerGenerated] 
private static bool <MyMethod>b__f(MyObject t) 
{ 
    return (String.IsNullOrEmpty(someNullString) 
       || t.SomeProperty >= Convert.ToDecimal(someNullstring)); 
} 

ngắn mạch hoạt động tốt ở đây.

Tôi nghi ngờ các yếu tố khác trong Số đếm của bạn đánh giá điều kiện đầu tiên (String.IsNullOrEmpty(someNullString)) thành sai. Bạn có thể xác nhận điều này không?

Cung cấp thêm một chút mã để chúng tôi có thể phân tích mã này.

-1

Bạn có biến số t trong bất kỳ phạm vi nào có thể được đánh giá không?

Bạn có thử với ngoặc như thế này:

.Where(t => (String.IsNullOrEmpty(someNullString) || 
      t.SomeProperty >= Convert.ToDecimal(someNullstring))) 

?

+0

=> xác định phạm vi của t. –

-1

Có một workaround trên The || (or) Operator in Linq with C# theo đó bạn sẽ làm gì trong trường hợp của bạn như:

.Where(t => t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0")) 

Tất nhiên điều này có thể không phải là giải pháp cần thiết trong trường hợp cụ thể của bạn, nhưng ít nhất nó mang lại một ý tưởng cách bỏ qua lỗi.

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