我有一个表的列具有空值...当我尝试查询该列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
经过一番谷歌搜索后,我找到了答案:
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)
一种可能性 - 如果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的?
| 归档时间: |
|
| 查看次数: |
13172 次 |
| 最近记录: |