有谁知道为什么这个逻辑:
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
我希望它只比较列是否为空或它是否具有我传递的值。
类似于:
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
替换为 regionid 的类型。
这将生成类似于以下的 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 的实例。
然后 (([Extent1].[regionid] IS NULL) AND (@p__linq__0 IS NULL))
条件实际上是有效的,因为它返回的值是数据库值和参数为空。在您的代码中,您可以将 null
传递给 .Equals
函数,它应该返回该值。
关于c# - LINQ 向 WHERE 子句添加额外的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35730204/