我正在尝试使用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')
这样可以使事情更清晰。我以为Entity Framework在生成查询之前会连接字符串。
答案 0 :(得分:3)
我将继续处理评论,您的原始问题和您对文章进行编辑时注意到的发现---我认为目标是将原始的两个陈述重构为一个陈述。
// 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();
我本来以注释的形式记录了我的答案,但是新语法最初可能并没有成为您的答案。我希望这会有所帮助。