其中condition等于true且Nullable对象必须具有值

Tyl*_*den 2 c# linq where linq-to-sql

我一直在寻找答案,但我找不到任何可以帮助我的东西.我收到这个错误

可以为空的对象必须具有值.

我的要求是:

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
Run Code Online (Sandbox Code Playgroud)

where条件的第三行是问题(categoryId).如果categoryId有一个值,它可以工作,但不是null.但是,我更换了这一行,true它也可以.我无法理解这里的问题是什么.

在我的表中,CategoryId可以为null,所以我试过:

(categoryId.HasValue && e.CategoryId.HasValue ? e.CategoryId.Value == categoryId.Value : true) 
Run Code Online (Sandbox Code Playgroud)

我想做什么:我想根据where条件选择该表的所有元素.categoryId来自下拉列表,因此如果在用户执行请求时仍然选择默认值,我想显示所有元素,无论类别如何.

nvo*_*igt 5

你应该善于比较你的两个变量:

e.CategoryId == categoryId
Run Code Online (Sandbox Code Playgroud)

如果你想要一个特殊处理是NULL,也许是因为你希望这是一个特殊情况,其中NULL匹配所有内容而不是只是另一个NULL,你可以添加:

e.CategoryId == categoryId || !e.CategoryId.HasValue || !categoryId.HasValue
Run Code Online (Sandbox Code Playgroud)

您的陈述的问题是您访问.Value.是的,如果你在内存中运行带有Linq-To-Objects的代码,它会起作用,因为编译器只会运行你的if语句的一个分支的代码(三元运算符,我知道,但你明白我的意思) .但对于数据库,需要准备一份声明.该声明需要完整存在,它不使用任何短路.因此,语句构建器访问您的两个分支以为数据库构建该语句,并且其中一个分支将失败,因为它访问.Value虽然没有.