我有一个接收类别id的方法,后跟两个默认为null的可选字符串参数。
我尝试使用其他问题的一些类似的答案,但没有任何帮助。
我试图让linq到EF查询工作如下:
如果任一可选参数具有值,则使用该值,否则使用Is Null。
如果存在两个可选参数,请将这些参数用作查询的一部分,或者仅在提供的eis上使用。但如果没有添加参数,只需使用类别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
不会引发错误,但除非两个参数都存在,否则两个查询总是返回零结果。
我试过的其中一个帖子: How can i query for null values in entity framework?
答案 0 :(得分:1)
第3次编辑运气,也许我这次正确地阅读了这个问题:)
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);
}
答案 1 :(得分:1)
据我所知,问题看起来像查询的条件没有正确写入。让我们通过一个例子来检查附加内容:
数据:
Id = 1, Param1 = null, Param2 = null
Id = 2, Param1 = 'a' param2 = null
Id = 3, Param1 = null, Param2 = 'b'
Id = 4, Param1 = 'a' param2 = 'c'
使用当前查询和建议的其他解决方案,您将只获得Id 1。 您的条件是:如果Param1为空并且c.Param1(存储的值)为空或者c.Param1等于Param1值。
你需要的条件是:如果Param1为空或者c.Param1等于Param1值。
如果您使用此查询,您将始终获得结果。
from c in dtx.Categories
where c.CategoryId == CatId
&& (string.IsNullOrEmpty(param1) || c.Param1 == param1)
&& (string.IsNullOrEmpty(param2) || c.Param2 == param2)
select c
答案 2 :(得分:0)
你应该明确地展开支票,要么都是null
,要么匹配
((string.IsNullOrEmpty(param1) && c.Param1 == null) || (c.Param1 == param1))
编辑:刚刚测试过,无关紧要是你检查null
或者SQL是否相同,所以只做
from c in dtx.Categories
where c.CategoryId == CatId
&& (c.Param1 == param1)
&& (c.Param2 == Param2)
select c
答案 3 :(得分:0)
问题在于你写了
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