组合字符串时方法语法中的 Where 子句失败

Posted

技术标签:

【中文标题】组合字符串时方法语法中的 Where 子句失败【英文标题】:Where clause in method syntax fails when combining strings 【发布时间】:2019-05-30 20:20:10 【问题描述】:

我正在尝试使用 Entity Framework 和 LINQ 从数据库中检索记录。它基本上可以按预期工作,但是对于带有 WHERE 语句的错误,我不太清楚。

var nodeId = "001";

//This works and returns the record I am looking for
var nodeDisplayName = ("#" + nodeId);
var filteredNodes = dbContext.Node.Where(n => n.DisplayName == nodeDisplayName).ToList();

//This does not work and returns 0 results
var filteredNodes2 = dbContext.Node.Where(n => n.DisplayName == ("#" + nodeId )).ToList();

我希望这两个变体的行为完全相同,如果我在内存中的 List 上运行它们,它们似乎会这样做。但是当针对实体框架/数据库运行时,它们的行为会有所不同。只需使用第一种方法,我就可以很容易地修复该错误,但我想了解导致行为差异的原因。

编辑

所以生成的 SQL 查询如下所示:

SELECT `n`.`id`, `n`.`display_name`, `n`.`reg_tms`
FROM `tablename`.`node` AS `n`
WHERE `n`.`display_name` = '#001'

SELECT `n`.`id`, `n`.`display_name`, `n`.`reg_tms`
FROM `tablename`.`node` AS `n`
WHERE `n`.`display_name` = ('#' + '001')

所以这让事情变得更清楚了。我曾假设实体框架会在生成查询之前连接字符串。

【问题讨论】:

定义“行为不同”。您检查了正在生成的 SQL 吗? $"#nodeId" 怎么样?它将避免嵌套括号内的丑陋连接。 @KunalMukherjee 为什么?它有什么变化? EF 甚至支持吗? 那么,EF 是否支持string.Format? @KunalMukherjee 这个问题关于EF的。 【参考方案1】:

我将继续处理 cmets、您的原始问题和您在帖子编辑中注明的发现 --- 我认为目标是将您原来的两个陈述重构为一个陈述。

// code to refactor into a single statement
var nodeDisplayName = ("#" + nodeId);
var filteredNodes = dbContext.Node.Where(n => n.DisplayName == nodeDisplayName).ToList();

这可以重构为...

// solution (refactored)
var filteredNodes = dbContext.Node.Where(n => n.DisplayName == $"#nodeId").ToList();

我最初将我的答案记录为评论,但新语法最初可能并没有作为您的答案脱颖而出。我希望这会有所帮助。

【讨论】:

以上是关于组合字符串时方法语法中的 Where 子句失败的主要内容,如果未能解决你的问题,请参考以下文章

SQL笔记SQL语法SELECT语句DISTINCT语句LIMITLIMIT和OFFSET组合使用WHERE 子句

WHERE子句MySQL中的PHP字符串变量

Where子句Mysql中的逗号分隔字符串参数过滤器

where子句中的多个字符匹配

使用 Linq 的 Where 子句中的子字符串

如何将字符串变量传递给动态sql中的where子句