MySQL Linq使用.Contains(变量)

时间:2014-12-07 00:18:11

标签: c# mysql linq entity-framework contains

设置信息:

  • VS2013 / C#
  • EF6
  • MySQL数据库
  • .Net Connector 6.9.5

我正在尝试创建一个方法,该方法使用部分名称作为搜索条件返回帐户记录的集合。如果我使用IQueryable .Contains()扩展方法对字符串值进行硬编码,则返回数据。但是,当我尝试使用变量时,不会返回任何数据。

Public class Test() {

MyEntities db = new MyEntities();

//Works....but the search criteria is hard coded.
  public IQueryable<Account> WorksButValueHardCoded() {

    return (from a in db.Accounts
           where a.accountname.Contains("Test")
           select a);
  }

//Does not return anything
  public IQueryable<Account> DoesNotReturnAnyData() {

    //Obviously I would use a parameter, but even this test fails
    string searchText = "Test";  

    return (from a in db.Accounts
           where a.accountname.Contains(searchText)
           select a);
  }
}

我可以在LINQ中看到生成的SQL使用了LIKE运算符,但我不明白变量是如何在读取时注入的:

SELECT
`Extent1`.`accountid`, 
`Extent1`.`accountname`
FROM `account` AS `Extent1`
WHERE `Extent1`.`accountname` LIKE '%p__linq__0%'

那么......为什么它适用于硬编码值而不是字符串变量?

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,并一步一步地跟着错误使用Glimpse(用于检查服务器正在做什么的好工具)。事实证明,SQL语句是正确构建的,因为我通过在数据库上执行它来获得结果。 问题可能是在语句中替换字符串变量。我猜LINQ并不是只替换你传递的字符串,而是将带有空格的变量填充到VARCHAR限制,这样你的查询就像

SELECT`Extent1`.`accountid`, `Extent1`.`accountname`
FROM `account` AS `Extent1`
WHERE `Extent1`.`accountname` LIKE '%Test                ...       %'

添加

.Trim()

到你的字符串,它可以工作。

public IQueryable<Account> DoesNotReturnAnyData() {
    string searchText = "Test";

    // Use Trim() here
    return (from a in db.Accounts
       where a.accountname.Contains(searchText.Trim())
       select a);
}

答案 1 :(得分:0)

理论上没有任何错误我可以看到

<强>更新

这对我来说在sqlServer

上运行正常
public IQueryable<Account> DoesNotReturnAnyData(MyEntities db,string searchText) {
    return (from a in db.Accounts
        where a.accountname.Contains(searchText )
        select a)
}

答案 2 :(得分:0)

这是MySQL Entity Framework 6.9.5的报告错误

Bug#74918:Entity Framework 6的查询结果不正确: https://bugs.mysql.com/bug.php?id=74918

已在MySQL Connector / Net 6.7.7 / 6.8.5 / 6.9.6版本中修复。

更新日志: 使用Entity Framework 6,将字符串引用传递给&#34; StartWith&#34; 子句会返回不正确的结果。

或者,解决方法是使用.Substring(0)强制实体不使用LIKE(可能会影响性能)。

return (from a in db.Accounts
    where a.accountname.Contains(searchText.Substring(0))