2009-07-14 45 views
11

Tôi có một bảng với một cột có giá trị null ... khi tôi cố gắng để truy vấn cho các hồ sơ mà cột đó IS NULL:LINQ to SQL - loại nullable trong mệnh đề where

NÀY CÔNG TRÌNH:



     var list = from mt in db.MY_TABLE 
        where mt.PARENT_KEY == null 
        select new { mt.NAME }; 

NÀY KHÔNG:



     int? id = null; 
     var list = from mt in db.MY_TABLE 
        where mt.PARENT_KEY == id 
        select new { mt.NAME }; 

Tại sao?

+1

Bạn đã thử xem SQL được tạo trong mỗi trường hợp chưa? Loại mt.PARENT_KEY là gì? –

+0

khóa chính là số nguyên –

+0

Trong mã được tạo? Nullable , Nullable ? –

Trả lời

20

sau khi một số googling hơn, tôi tìm thấy câu trả lời:

ref #1

ref #2

int? id = null; 
var list = from mt in db.MY_TABLE 
      where object.Equals(mt.PARENT_KEY, id) //use object.Equals for nullable field 
      select new { mt.NAME }; 

LINQ này hiển thị cho SQL như sau:

((mt.PARENT_KEY IS NULL) AND (@id IS NULL)) 
OR ((mt.PARENT_KEY IS NOT NULL) AND (@id IS NOT NULL) AND (mt.PARENT_KEY = @id)) 
5

Một khả năng - nếu mt.PARENT_KEY thuộc một số loại khác (ví dụ: long?) thì sẽ có chuyển đổi liên quan.

Sẽ hữu ích nếu bạn có thể hiển thị các loại có liên quan và truy vấn được tạo trong mỗi trường hợp.

EDIT: Tôi nghĩ rằng tôi có một ý tưởng ...

Nó có thể là bởi vì SQL và C# có ý kiến ​​khác nhau về những gì bình đẳng có nghĩa là khi nói đến null. Hãy thử điều này:

where (mt.PARENT_KEY == id) || (mt.PARENT_KEY == null && id == null) 

Nếu đây trường hợp sau đó nó là một trường hợp góc khá xấu xí, nhưng tôi có thể hiểu được lý do tại sao nó được thực hiện theo cách đó ... nếu SQL được tạo ra chỉ được sử dụng

WHERE PARENT_KEY = @value 

thì điều đó sẽ không hoạt động khi giá trị là null - cần:

WHERE (PARENT_KEY = @value) OR (PARENT_KEY IS NULL AND @value IS NULL) 

đó là những gì truy vấn LINQ sau đó sẽ tạo ra.


Ra quan tâm, tại sao bạn chọn với

select new { mt.NAME } 

thay vì chỉ

select mt.NAME 

?) Tại sao bạn sẽ muốn có một chuỗi các loại vô danh thay vì một chuỗi các chuỗi (hoặc bất kỳ loại nào NAME là?

+0

Tôi đã cập nhật câu trả lời của Nick để phản ánh cách Object.Equals hiển thị với SQL. Theo ý kiến ​​của bạn, có thêm '(mt.PARENT_KEY IS NOT NULL) AND (@id IS NOT NULL)' trong Dòng 2 thừa không? Điều này được gợi ý bằng câu trả lời của bạn. (Các ký tự khác của LINQ, ít ký tự của SQL) –

1

Đó chắc chắn là vấn đề của C# và SQL có quan niệm khác nhau về cách thức để so sánh null - câu hỏi đã được giải quyết ở đây trước:

Compare nullable types in Linq to Sql

+0

có, nhưng giải pháp đó là waaaayyyy quá phức tạp –

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