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

时间:2019-01-04 09:12:14

标签: c# entity-framework linq lambda .net-core

我正在尝试使用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在生成查询之前会连接字符串。

1 个答案:

答案 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();

我本来以注释的形式记录了我的答案,但是新语法最初可能并没有成为您的答案。我希望这会有所帮助。