【发布时间】:2017-10-24 15:20:36
【问题描述】:
MySql DbContext 有两个 linq 查询:
var letter1 = (from l in dbContext.letters_incoming
where l.LetterText.Trim() == "simple letter text".Trim()
select l).FirstOrDefault();
var letter2 = dbContext.letters_incoming.Where(new Func<ModelLetterIncoming, bool>(l => {
string name = l.LetterText;
if (name == "simple letter text")
return true;
else return false;
})).FirstOrDefault();
第一个查询返回 null,但第二个返回正确的值。这可能是由我的 Where 条件中的空格引起的吗?
【问题讨论】:
-
一方面在“简单字母文本”上调用 Trim() 是多余的,可以删除。这是一个没有前导或尾随空格的字符串文字, Trim() 消除了它。
-
第一个 linq 查询被转换为 SQL 查询并在数据库中执行。其次将整个
letters_incoming表拉入内存并在那里执行过滤。这可能会导致差异(尽管不确定为什么)。您可以使用日志(如dbContext.Database.Log = Console.WriteLine)检查生成了哪些 SQL 查询,并检查生成了哪些查询以及为什么找不到该行。可能是一些排序问题(特别是如果您的字符串不是英文的)。 -
真的没有看到错误,你能用这段代码验证问题吗?
-
@RandRandom,问题是我无法从按字符串值过滤的数据库集中选择任何实体
-
然后检查如何在 mysql 中使用西里尔字符(或 UTF)。这个问题似乎与 EF 无关,但与 mysql 有关。确保您的查询首先在没有 EF 的情况下工作(简单的 select * from letters where name = "your cyrillic string")。我多年没有使用 mysql,所以无法给出确切的理由。
标签: c# linq where whitespace trim