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),

LINQ 向 WHERE 子句添加了额外的逻辑

您可以通过执行以下操作来清理它:

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 函数,它应该返回该值。