组合字符串时方法语法中的 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 子句失败的主要内容,如果未能解决你的问题,请参考以下文章