我有一个接收类别ID的方法,后面两个可选的字符串参数默认为null。
我试着用在SO但没有SOFAR帮助其他的问题了几个类似的答案。
我试图让LINQ到EF查询的工作方式如下:
如果任何一个可选参数有一个值,使用值,否则使用的是空的。
如果两个可选参数是本发明的使用这些作为查询的一部分,或者任何一个如果只在EIS提供。 但是,如果没有添加parmeters,只需使用类别ID。
在DB既可选参数被标记为空。
这里是不工作的代码:
from c in dtx.Categories
where c.CategoryId == CatId
&& (string.IsNullOrEmpty(param1) ? c.Param1 == null : c.Param1 == param1)
&& (string.IsNullOrEmpty(param2) ? c.Param2 == null : c.Param2 == Param2)
select c
尝试二:
from c in dtx.Categories
where c.CategoryId == CatId
&& (c.Param1 == null ? c.Param1 == null : c.Param1 == param1)
&& (c.Param2 == null ? c.Param2 == null : c.Param2 == param2)
select c
不会引发任何错误,但两者的查询总是返回零分的结果,除非这两个参数的存在。
一个我试过的帖子: 我如何可以查询在实体框架空值?
从我所知道的,看起来像查询条件的问题不正确写入。 让检查什么会用一个例子追加:
数据:
Id = 1, Param1 = null, Param2 = null
Id = 2, Param1 = 'a' param2 = null
Id = 3, Param1 = null, Param2 = 'b'
Id = 4, Param1 = 'a' param2 = 'c'
在当前的查询,并提出了其他解决办法,你只会得到编号1.您的条件都在说:如果参数1 IS NULL和c.Param1(储值)为null或c.Param1等于参数1的值。
你需要的是,上面写着一个条件:如果参数1为空或c.Param1等于参数1的值。
如果您使用此查询,你总是会得到你的结果。
from c in dtx.Categories
where c.CategoryId == CatId
&& (string.IsNullOrEmpty(param1) || c.Param1 == param1)
&& (string.IsNullOrEmpty(param2) || c.Param2 == param2)
select c
第三编辑运气,也许是我正确的这个时候读的问题:)
var p1 = string.IsNullOrEmpty(param1) ? null : param1;
var p2 = string.IsNullOrEmpty(param2) ? null : param2;
var query = dtx.Categories.Where(c => c.CategoryId == CatId);
if (p1 != null || p2 != null) {
query = query.Where(c => c.Param1 == p1 && c.Param2 == p2);
}
你应该明确地展开检查,要么都是null
或它们匹配
((string.IsNullOrEmpty(param1) && c.Param1 == null) || (c.Param1 == param1))
编辑:刚刚测试并不要紧为U检查null
或不SQL是一样的,所以只是做
from c in dtx.Categories
where c.CategoryId == CatId
&& (c.Param1 == param1)
&& (c.Param2 == Param2)
select c
问题是,当你写
from ... where c.Param1 == null ...
的LINQ翻译为相同的SQL表达式:
SELECT ... FROM ... WHERE Param1 = null ...
但你需要这样的:
SELECT ... FROM ... WHERE Param1 IS NULL ...
所以在这里正确的解决方案是 :
from c in dtx.Categories
where c.CategoryId == CatId &&
(param1 == null ? !c.Param1.HasValue : c.Param1.Value == param1) &&
(param2 == null ? !c.Param2.HasValue : c.Param2.Value == param2)
select c