我有这个LINQ语句,如果序列为空则返回null。我将结果分配给可空的DateTime
。稍后我会检查DateTime.HasValue
属性和ReSharper是否告诉我表达式始终为真。
DateTime? latestUploadDateInBLSO = Documents.Where(d => d.DocumentLinkId == documentLinkId &&
d.UploadedInStage.StageNumber == 6 &&
d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId)
.Select(d => d.UploadedOnDate)
.DefaultIfEmpty()
.Max();
if (latestUploadDateInBLSO.HasValue) { // <-- Says this is always true
Documents.Single(d => d.DocumentLinkId == documentLinkId &&
d.UploadedOnDate == latestUploadDateInBLSO &&
d.UploadedInStage.StageNumber == 6 &&
d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId).IsLatestVersion = true;
}
由于latestUploadDateInBLSO
可以为null,该表达式如何始终为真?
答案 0 :(得分:5)
由于UploadedOnDate
不可为空,结果将始终为DateTime
值且永不为空。如果列表为空,您将获得default(DateTime)
DateTime.MinValue
。
如果您希望它返回null
,则您需要将UploadedOnDate
投放到DateTime?
。如果类型可以为空,则可以省略DefaultIfEmpty
按the docs Max
将返回null
以获取空序列。
DateTime? latestUploadDateInBLSO = Documents
.Where(d => d.DocumentLinkId == documentLinkId && d.UploadedInStage.StageNumber == 6 && d.DocumentOwnerTeam.TeamId == AuthorUser.Team.TeamId)
.Select(d => (DateTime?)d.UploadedOnDate)
.Max();
答案 1 :(得分:3)
如果uploadedOnDate也是DateTime类型,那么它不是NULL。 DateTime的默认值等于DateTime.MinValue。这就是为什么你的nullable总是有价值的原因。如果你想改变它,你将明确地通过DefaultIfEmpty说并返回NULL作为默认值。
答案 2 :(得分:2)
这是因为DefaultIfEmpty
调用与一系列非可空元素(DateTime
)结合在一起 - 你说的是从Where
和{{1}返回的集合}为空,而是返回一个包含单个默认Select
的集合,因此它永远不会返回DateTime
。
这是一个带有LINQPad输出的小样本:
null
答案 3 :(得分:1)
DefaultIfEmpty可能正在将DateTime对象初始化为其默认值DateTime.MinValue,因此它永远不会为null,因此HasValue将始终返回true。