作者:小菜一蝶2502902341 | 来源:互联网 | 2022-12-02 15:27
我一直在寻找答案,但我找不到任何可以帮助我的东西.我收到这个错误
可以为空的对象必须具有值.
我的要求是:
from e in dc.tblElements
where
e.IsUnique &&
(e.TypeID == 2) &&
(categoryId != null ? e.CategoryId.Value == categoryId.Value : true) &&
((e.Name.Contains(keyword)) ||
(e.Keywords.Contains(keyword)))
select e
where
条件的第三行是问题(categoryId
).如果categoryId
有一个值,它可以工作,但不是null
.但是,我更换了这一行,true
它也可以.我无法理解这里的问题是什么.
在我的表中,CategoryId可以为null,所以我试过:
(categoryId.HasValue && e.CategoryId.HasValue ? e.CategoryId.Value == categoryId.Value : true)
我想做什么:我想根据where条件选择该表的所有元素.categoryId来自下拉列表,因此如果在用户执行请求时仍然选择默认值,我想显示所有元素,无论类别如何.
1> nvoigt..:
你应该善于比较你的两个变量:
e.CategoryId == categoryId
如果你想要一个特殊处理是NULL,也许是因为你希望这是一个特殊情况,其中NULL匹配所有内容而不是只是另一个NULL,你可以添加:
e.CategoryId == categoryId || !e.CategoryId.HasValue || !categoryId.HasValue
您的陈述的问题是您访问.Value
.是的,如果你在内存中运行带有Linq-To-Objects的代码,它会起作用,因为编译器只会运行你的if语句的一个分支的代码(三元运算符,我知道,但你明白我的意思) .但对于数据库,需要准备一份声明.该声明需要完整存在,它不使用任何短路.因此,语句构建器将访问您的两个分支以为数据库构建该语句,并且其中一个分支将失败,因为它访问.Value
虽然没有.