LINQ 向 WHERE 子句添加了额外的逻辑
本文关键字:WHERE 子句 添加 LINQ | 更新日期: 2023-09-27 18:36:52
>有人知道为什么这个逻辑:
var t = _repo.Surveys
.Where(s => s.status &&
(s.regionid == null || s.regionid.Value.Equals(regionid)))
.ToList();
会构造这个WHERE
子句吗?
WHERE ([Extent1].[status] = 1)
AND (([Extent1].[regionid] IS NULL) OR
(([Extent1].[regionid] = @p__linq__0) AND ( NOT ([Extent1].[regionid] IS NULL OR @p__linq__0 IS NULL))) OR
(([Extent1].[regionid] IS NULL) AND (@p__linq__0 IS NULL)))'
,N'@p__linq__0 int',@p__linq__0=0
我希望它只会在列为 null 或具有我传递的值时进行比较。
像这样:
例如WHERE status = 1 AND (regionid IS NULL OR regionid = 0),
。
您可以通过执行以下操作来清理它:
var parameters = new List<Type?>() { null, regionid };
var t = _repo.Surveys
.Where(s => s.status && parameters.Contains(s.regionid))
.ToList();
注意:将Type
替换为区域 ID 的类型。
这将生成类似于以下内容的 SQL:
WHERE (0 = [Extent1].[Status])
AND ((([Extent1].[RegionId] IN (regionIdValue)) AND ([Extent1].[RegionId] IS NOT NULL)) OR
([Extent1].[RegionId] IS NULL))
此时,唯一额外的 SQL 是作为 IN 一部分的AND ([Extent1].[RegionId] IS NOT NULL)
条件。
话虽如此,原始 LINQ 生成的 SQL 完全有意义。 (NOT ([Extent1].[RegionId] IS NULL OR @p__linq__0 IS NULL))
条件排除数据库值为 null 或参数值为 NULL 的实例。
然后,(([Extent1].[regionid] IS NULL) AND (@p__linq__0 IS NULL))
条件实际上是有效的,因为它返回的值,其中数据库值和参数均为 null。 在代码中,您可以将null
传递给 .Equals
函数,它应该返回该值。