LINQ to SQL - where子句中的可空类型

Nic*_*ina 11 linq-to-sql

我有一个表的列具有空值...当我尝试查询该列IS NULL的记录时:

这个工作:



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

Run Code Online (Sandbox Code Playgroud)

这不是:



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

Run Code Online (Sandbox Code Playgroud)

为什么?

Nic*_*ina 20

经过一番谷歌搜索后,我找到了答案:

ref#1

参考#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 };
Run Code Online (Sandbox Code Playgroud)

这个LINQ呈现给SQL如下:

((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))
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

一种可能性 - 如果mt.PARENT_KEY是某种其他类型(例如long?)那么将涉及转换.

如果您可以显示所涉及的类型以及在每种情况下生成的查询,将会有所帮助.

编辑:我想我有个主意......

这可能是因为SQL和C#对于null有什么相同的含义.试试这个:

where (mt.PARENT_KEY == id) || (mt.PARENT_KEY == null && id == null)
Run Code Online (Sandbox Code Playgroud)

如果这种情况那么这是一个非常丑陋的角落案例,但我可以理解为什么这样做...如果生成的SQL只是使用

WHERE PARENT_KEY = @value
Run Code Online (Sandbox Code Playgroud)

当值为null时,这将无效 - 它需要:

WHERE (PARENT_KEY = @value) OR (PARENT_KEY IS NULL AND @value IS NULL)
Run Code Online (Sandbox Code Playgroud)

这是后一个LINQ查询应该生成的内容.


出于兴趣,你为什么选择

select new { mt.NAME }
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

select mt.NAME
Run Code Online (Sandbox Code Playgroud)

?)为什么你想要一系列匿名类型而不是一串字符串(或者是什么类型NAME的?