Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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

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
linq查询where子句中的vb.net iif条件_Vb.net_Linq_Sharepoint 2010 - Fatal编程技术网

linq查询where子句中的vb.net iif条件

linq查询where子句中的vb.net iif条件,vb.net,linq,sharepoint-2010,Vb.net,Linq,Sharepoint 2010,下面的查询有什么问题,我得到了这个错误: 可为null的对象必须有一个值。 这是错误的部分 IIf(u.StartDate.Value <= inv.EndDate.Value, True, False) IIf(u.StartDate.Value 使用If而不是IIf。这是短路的(就像C#的条件运算符),并且会起作用,因为只有当HasValue为TrueIIf被弃用时,才会对条件进行评估。切勿使用它 此外,像If(condition,True,False)这样的表达式是毫无意义的。请将

下面的查询有什么问题,我得到了这个错误: 可为null的对象必须有一个值。

这是错误的部分

IIf(u.StartDate.Value <= inv.EndDate.Value, True, False)
IIf(u.StartDate.Value
  • 使用
    If
    而不是
    IIf
    。这是短路的(就像C#的条件运算符),并且会起作用,因为只有当
    HasValue
    True
    IIf
    被弃用时,才会对条件进行评估。切勿使用它

  • 此外,像
    If(condition,True,False)
    这样的表达式是毫无意义的。请将其替换为just
    condition

  • 最后,您需要使用
    AndAlso
    而不是
    ——同样,为了发生短路。事实上,在条件句中始终使用
    AndAlso
    。仅在执行位操作时才使用

  • DirectCast
    也是不必要的

这给我们留下了一个非常简化的表达式:

If(Not u.EndDate.HasValue, u.StartDate.Value <= inv.EndDate.Value), _
    (u.StartDate.Value >= inv.StartDate.Value AndAlso u.StartDate.Value <= inv.EndDate.Value) OrElse _
    (u.EndDate.Value >= inv.StartDate.Value AndAlso u.EndDate.Value <= inv.EndDate.Value) OrElse _
    (u.StartDate.Value < inv.StartDate.Value AndAlso u.EndDate.Value > inv.EndDate.Value))
If(不是u.EndDate.HasValue,u.StartDate.Value=inv.StartDate.Value,也不是u.StartDate.Value=inv.StartDate.Value,也不是u.EndDate.Value inv.EndDate.Value))

但是这个表达式仍然太复杂了。您应该将其拆分,但首先使用查询中的
Let
将空值中的值分配给某个临时变量。

IIF对两个结果都进行计算,即使它只返回一个结果。因此,如果一个结果会导致异常(比如在没有异常的情况下访问null的.Value),那么即使在IIF开头检查.HasValue,只要在IIF求值的两个部分上展开,也会得到一个错误

请尝试以下代码:

IIF (True, msgbox("True"), msgbox("false"))

您将看到两个消息框。一个说“真”,一个说“假”。尽管很明显,您应该只触发True部分。

我假设这些日期可以为null,其中一个为null。在一个空的可空字段上访问
是不允许的。我正在检查日期字段是否有正确的值?u、 EndDate.hasvalue
IIf
功能不短路。为什么要使用
IIf(u.StartDate.Value@Jon Skeet我也告诉过他同样的改进,但这仍然无法修复错误。不过我相信OP仍然有错误。他正在检查
而不是u.EndDate.HasValue
,然后在
TruePart
参数中使用
u.EndDate.Value
。这保证不起作用,对吗?除非我缺少s。)有什么。@Dan我当然不能确定–但是OP使用了一个不同的
结束日期,即
inv
,而不是
u
。@Dan让我想想。嗯,可能是因为这个表达式太复杂太令人费解了吧?
If(Not u.EndDate.HasValue, u.StartDate.Value <= inv.EndDate.Value), _
    (u.StartDate.Value >= inv.StartDate.Value AndAlso u.StartDate.Value <= inv.EndDate.Value) OrElse _
    (u.EndDate.Value >= inv.StartDate.Value AndAlso u.EndDate.Value <= inv.EndDate.Value) OrElse _
    (u.StartDate.Value < inv.StartDate.Value AndAlso u.EndDate.Value > inv.EndDate.Value))
IIF (True, msgbox("True"), msgbox("false"))