C# 组合字符串时,方法语法中的Where子句失败
我正在尝试使用实体框架和LINQ从数据库中检索记录。它的工作原理与预期基本一致,但对于带有WHERE语句的bug,我不太清楚C# 组合字符串时,方法语法中的Where子句失败,c#,entity-framework,linq,lambda,.net-core,C#,Entity Framework,Linq,Lambda,.net Core,我正在尝试使用实体框架和LINQ从数据库中检索记录。它的工作原理与预期基本一致,但对于带有WHERE语句的bug,我不太清楚 var nodeId = "001"; //This works and returns the record I am looking for var nodeDisplayName = ("#" + nodeId); var filteredNodes = dbContext.Node.Where(n => n.DisplayName == nodeDispl
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();
我希望这两个变量的行为完全相同,如果我在内存中的列表中运行它们,它们似乎会这样做。但在实体框架/数据库上运行时,它们的行为不同。我可以通过使用第一种方法很容易地修复这个bug,但是我想了解是什么导致了行为上的差异
编辑
因此,生成的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')
这样事情就明朗了一点。在生成查询之前,我假设Entity Framework将对字符串进行压缩。我将继续处理您在文章编辑时提到的注释、原始问题和发现,我认为目标是将原始两条语句重构为一条语句
// 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();
我最初把我的回答作为一个评论,但新的语法可能并不能作为一个最初的答案。我希望这能有所帮助。定义“行为不同”。您是否检查了正在生成的SQL?改为
$“{nodeId}”
怎么样?它可以避免嵌套括号中丑陋的concat。@KunalMukherjee为什么?它改变了什么?EF支持吗?那么,EF支持string.Format
@这个问题是关于EF的。