2013-08-06 20 views
6

Cho phép xem xét một bảng có 2 cột: ID (int) và Role (string). Cả hai đều không có giá trị.truy vấn LINQ-to-SQL không trả về hàng khi mệnh đề where so sánh với giá trị NULL

Bây giờ giả sử rằng các dữ liệu trong hai cột là:

ID  Role 
--  ---- 
1  NULL 
2  Admin 

Truy vấn trông như thế này:

List<types> t1 = (
    from a in datacontext.RoleTable 
    where a.Role != "Admin" 
    select a 
).ToList(); 

tôi nghĩ các truy vấn trên nên được trả lại hồ sơ đầu tiên của bảng như cột Vai trò của nó không bằng 'Quản trị' nhưng truy vấn trả về một danh sách trống.

Bây giờ khi tôi sử dụng truy vấn này:

List<types> t2 = (
    from a in datacontext.RoleType 
    where a.Role != "Admin" && a.Role == DBNull.Value.ToString() 
    select a 
).ToList(); 

tôi nhận được câu trả lời đúng.

Ai đó có thể cho tôi biết tại sao truy vấn đầu tiên không hoạt động.

FYI: Nếu cột Vai trò trong hàng đầu tiên trong bảng được thay đổi thành User thay vì NULL thì truy vấn đầu tiên hoạt động tốt.

Tôi đang sử dụng SQL Express và LINQ to SQL.

+0

Các bạn đã thử 'Equals() '? –

+0

Không có thats không phải là điểm tôi muốn biết tại sao truy vấn đầu tiên không hoạt động như mong đợi. –

Trả lời

10

Truy vấn đầu tiên không như mong đợi, bởi vì nó được dịch sang SQL đó là tương đương như sau:

select * from RoleTable where Role != 'Admin' 

Bây giờ, trong SQL NULL != 'Admin'khôngTRUE (cũng không phải là FALSE - nó là không xác định).
Đó là một trong nhiều trường hợp sự trừu tượng mà LINQ to SQL cung cấp bị rò rỉ và bạn vẫn cần biết SQL.

BTW: Truy vấn thứ hai của bạn cũng không chính xác, nó sẽ chỉ chọn những hàng là null. Nó sẽ không chọn một hàng với vai trò 'User'.

Các truy vấn chính xác sẽ trông như thế này:

List<types> t2 = 
    (from a in datacontext.RoleTable 
    where a.Role != "Admin" || a.Role == null 
    select a).ToList(); 
+0

Sự tò mò tinh khiết - 'NULL! = 'Admin'' trong SQL là gì? Chắc chắn không phải là 'sai'? – Andrei

+5

@Andrei: Không xác định. Nó không đúng hay sai. –

+0

FYI: Truy vấn thứ hai trả về Bản ghi đầu tiên vì nó không bằng "Quản trị" và nó bằng dbnull –