【问题标题】:C# Entity Framework Linq Where issueC# Entity Framework Linq Where 问题
【发布时间】: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


【解决方案1】:

问题出在 MySqlConnectionStringBuilder 中,我添加了

mySqlConnectionStringBuilder.CharacterSet = "utf8"; 

它可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2011-06-26
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多