Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在int上使用ISNULL?在Linq查询的WHERE子句中_C#_Linq - Fatal编程技术网

C# 在int上使用ISNULL?在Linq查询的WHERE子句中

C# 在int上使用ISNULL?在Linq查询的WHERE子句中,c#,linq,C#,Linq,我一直在试图找到解决方法,我已经看到了许多示例,说明如何在SELECT语句中使用ISNULL功能,或者如何在WHERE子句中检查null以返回布尔值 但是,通过搜索,我找不到任何关于如何根据值是否为null返回整数的示例 我试图从SQL复制一个简单的功能: SELECT * FROM Projects WHERE ISNULL(projects.ParentID , 0) = @Value 根据我在整个搜索过程中看到的有关SELECT子句或ISNULL布尔运算的建议,我尝试了几种不同的方法

我一直在试图找到解决方法,我已经看到了许多示例,说明如何在
SELECT
语句中使用
ISNULL
功能,或者如何在
WHERE
子句中检查null以返回布尔值

但是,通过搜索,我找不到任何关于如何根据值是否为null返回整数的示例

我试图从SQL复制一个简单的功能:

SELECT * 
FROM Projects 
WHERE ISNULL(projects.ParentID , 0) = @Value
根据我在整个搜索过程中看到的有关
SELECT
子句或
ISNULL
布尔运算的建议,我尝试了几种不同的方法:

var output = (from p in ctx.Projects...
一,

二,

三,

四,

五,

…选择p

如果您能提供任何帮助,我将不胜感激。我不明白为什么Linq与SQL相比如此复杂

为什么不干脆:

var q = ctx.Projects.Where(p => p.ParentId == parentId);
如果
parentId
int
int?
,则该选项有效

如果将空值视为0,则应该可以:

 var q = ctx.Projects.Where(p => (p.ParentId ?? 0) == parentId);
为什么不简单地:

var q = ctx.Projects.Where(p => p.ParentId == parentId);
如果
parentId
int
int?
,则该选项有效

如果将空值视为0,则应该可以:

 var q = ctx.Projects.Where(p => (p.ParentId ?? 0) == parentId);
怎么样

where (p.ParentId == value) || (value == 0 && p.ParentId == null)
因为value==0是生成查询的时间,所以您将获得一些性能

怎么样

where (p.ParentId == value) || (value == 0 && p.ParentId == null)


因为value==0是生成查询的时间,所以您将获得一些性能

在这些情况下,结果是什么(请注意,“不起作用”不是一个问题描述)?还有.HasValue来检查可为null的变量是否为null。那么,这样做如何:
ctx.Projects.Where(x=>!x.ParentID.HasValue&&value==0)
直接等价物是
??
运算符。为什么你认为
(p.ParentID,0)
ISNULL(p.ParentID,0)
更复杂?在这些情况下,结果是什么(请注意,“不起作用”不是一个问题描述)?还有.HasValue来检查可为null的变量是否为null。那么:
ctx.Projects.Where(x=>!x.ParentID.HasValue&&value==0)
直接等价物是
??
运算符。为什么您认为
(p.ParentID,0)
ISNULL(p.ParentID,0)
更复杂?因为他需要检查ParentID是否为null,值是否为零,然后才是真的。检查他的sql查询这是第二个建议,看起来是解决方案。与我的试用版2相似,但缺少括号。非常感谢。这将生成类似sql的'(当p.ParentID为NULL时为0,否则p.ParentID)=@Var',这有点复杂。因为他需要检查ParentID是否为NULL,值是否为零,这是真的。检查他的sql查询这是第二个建议,看起来是解决方案。与我的试用版2相似,但缺少括号。非常感谢。这将生成sql-like'(当p.ParentID为NULL时,则为0,否则p.ParentID)=@Var',这有点复杂。这看起来确实可以解决我的问题,但我选择采纳Tim的建议,因为我认为它更干净。非常感谢您的输入。请在其他答案中检查生成的sql。您将在SQL中看到复杂的切换情况。这看起来确实可以解决我的问题,但是我选择了支持Tim的建议,因为它看起来更干净。非常感谢您的输入。请在其他答案中检查生成的sql。您将在SQL中看到复杂的切换情况。
 var q = ctx.Projects.Where(p => (p.ParentId ?? 0) == parentId);
where (p.ParentId == value) || (value == 0 && p.ParentId == null)