c# - LINQ 向 WHERE 子句添加额外的逻辑

标签 c# sql linq

有谁知道为什么这个逻辑:

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/

相关文章:

c# - 避免使用 if-else 或 switch-case 语句来进行决定

c# - 为什么 .NET 字符串是不可变的?

php mysql 根据多个条件获取最新记录并统计

mysql - 在 SQL 中的一个字段中添加多个数据

c# - 替换系统对象的策略

c# - 在子查询中涉及计数的高效查询

c# - 使用 iTextSharp 验证 PDF 是否受到保护/保护

c# - 在哪里实现 try catch block ?

php - 如何在 PHP 中使用 SQLSTATE '45000' MESSAGE_TEXT?

c# - Linq Order By 包含列表