2011-02-08 42 views
8

Có thể ai đó chỉ ra tại sao điều này có thể xảy ra:C# lambda lạ hành vi

Tôi đang sử dụng NHibernateLinq cung cấp cho nó.

Các mã mà không được liệt kê ở đây:

var sequence = session.Query<T>(); 

var wtfSequence = sequence.Where(x => true); 
var okaySequence = sequence.Where(x => x.Id > 0); 

Debugging cho thấy sequence (mà là một IQueryable<T>) sau này có chứa 2 thành phần, được bổ sung vào cơ sở dữ liệu.

Tôi mong đợi câu lệnh Where đầu tiên mang lại tất cả các phần tử từ chuỗi đó, nhưng tiếc là nó để lại 0 phần tử.

(TẠI SAO ???)

Thứ hai Where tuyên bố, ngược lại, thực sự mang lại 2 yếu tố như nó phải làm việc.

Dưới đây là các truy vấn NHibernate -> Sqlite cho câu lệnh Where đầu tiên và thứ hai.

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)] 

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)] 

Bây giờ, nếu tôi thử nghiệm cùng mã với InMemoryRepository của tôi, mà các cửa hàng mỗi thực thể trong một danh sách đơn giản, (x => true) hoạt động tốt absolutelty.

Vậy - tại sao điều này xảy ra khi sử dụng NHibernate? Đây có phải là một lỗi hoặc tôi đang làm điều gì sai?

Cảm ơn bạn.

+2

Nó rất có thể liên quan đến cách NHibernate xử lý biểu thức nó tạo ra từ lambda, mặc dù lòng tốt biết những gì nó đang làm ... – Massif

Trả lời

5

Tôi không biết NHibernate, nhưng vấn đề là hiển nhiên từ SQL được tạo ra: Cơ sở dữ liệu của bạn không xem xét đúng (chữ thường t) bằng True (chữ hoa T). Trong máy chủ SQL, bạn có thể thay đổi điều này bằng cách sửa đổi collation cơ sở dữ liệu (đó là một ý tưởng thực sự xấu, trừ khi bạn muốn trường hợp vô cảm vì lý do khác).

Tôi đoán đây là một lỗi trong NHibernate mà bạn cần phải làm việc xung quanh. Kiểm tra t => 1 == 1 thay vì t => true, có thể hoạt động tùy thuộc vào cách mã NHibernate được viết.

+1

Đồng ý. Và vui lòng mở một vé tại http://jira.nhforge.org –

+0

http://216.121.112.228/browse/NHLQ-91 –

2

Đoán của tôi là đây là lỗi trong NHibernate dựa trên đầu ra SqLite mà bạn hiển thị. Bạn có thể thử X => X.Id == X.Id thay vì X => true và xem điều đó có hiệu quả hay không.

1

Trông giống như một lỗi đối với tôi. Nó chuyển đổi một phép toán boolean thành một chuỗi đánh giá, và thậm chí nó được điều chỉnh, vì nó thiết lập truy vấn với true và đánh giá bằng cách sử dụng True, vì vậy một kiểm tra phân biệt chữ hoa chữ thường sẽ thất bại.