【发布时间】:2020-01-15 13:45:39
【问题描述】:
我一直在为即将举行的考试查看一些 MS 参考资料,并发现了一个我不同意答案的所谓以前的问题。
经过考虑,我将发布问题的屏幕截图,而不是浓缩问题,以防万一我抽象出手头问题的任何相关信息。
我的问题是他们给出的答案是 B,而我认为应该是 A,原因如下。
LINQ 查询中的 where 子句有两个条件,它必须与 DateTime 中年份匹配的条件进行比较?对象和方法参数。
但是,我更感兴趣的是为什么他们认为由于参数类型是不可为空的 int 而需要进行空检查。在按值传递参数之前取消赋值和尝试赋值 null 将导致编译器错误。
如果年份参数永远不能为 null,则永远不会有 null DateTime 匹配 - 使 null 检查变得多余。
我知道为什么 B 也会产生预期的结果,但是回答 A 有什么错误。
(附言我读过 - Comparing non nullable `int` to `null` (LINQ) 这似乎支持我的理论,我只是对不同意参考资料感到不安)
【问题讨论】:
-
@sam 一个公平的评论 - 我在犹豫是否首先包含图像,但我想将其保持为可读格式,并且不必围绕它创建支持代码。我认为这个问题的创建者的意图是考虑原则,而不是考虑如何将其变为可编译状态。
-
SQL Server 的 DateTime 可以为 null,而 c# DataTime 不可为空。
-
你应该问查询的作者......回答
A如果你考虑到它是EF(因为表达式将被翻译成SQL),AFAIK应该可以工作......但它不会在“plain C#”(其他人写的会抛出异常) -
fx A 可以直接翻译成
WHERE DATEPART(year, OrderDate) = @year... 而 B 可以直接翻译成WHERE OrderDate IS NOT NULL AND DATEPART(year, OrderDate) = @year... 从 SQL 的角度来看,它们将返回相同的结果
标签: c# linq parameter-passing nullable