2014-12-07 45 views
1

设置信息:MySQL的LINQ的使用。载有(可变)

  • VS2013/C#
  • EF6
  • MySQL数据库
  • 的.Net连接器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%' 

所以...为什么它的工作原理与硬编码值,而不是一个字符串变量?

+0

请包括您提交给MySQL的错误。我遇到同样的问题 – Ablue 2015-01-07 06:33:44

+1

这里是:http://bugs.mysql。com/bug.php?id = 75137 – Ablue 2015-01-07 08:04:43

+0

看到相同的问题w/6.9.5,回滚到“Install-Package MySql.Data.Entities.EF6”,它是6.8.3,如@Ablue注释中所述(也是:http ://bugs.mysql.com/bug.php?id=75193和http://bugs.mysql.com/bug.php?id=74918和http://bugs.mysql.com/bug.php?id= = 74943)唷! – sobelito 2015-01-19 21:35:02

回答

0

没有什么错在理论上我可以看到

更新

这是我在SQLSERVER做工精细

public IQueryable<Account> DoesNotReturnAnyData(MyEntities db,string searchText) { 
    return (from a in db.Accounts 
     where a.accountname.Contains(searchText) 
     select a) 
} 
+0

是的,你是正确的,因为上下文在返回之前处理(我已经改变为使用上下文的类属性)使用.ToList()函数确实会强制查询。我试过了,但结果相同。硬编码时工作,在使用字符串变量时不起作用。 – 2014-12-07 01:25:46

+0

我知道,对于MySQL的最新.Net连接器中的.Contains,.StartsWith和&.EndsWith扩展有一些变化,这与使用关键字'LIKE'有关。我几乎想知道这是否是一个新的错误。有另一种方法可以做同样的事情,我可以测试吗? – 2014-12-07 01:35:29

+0

刚刚更新,上述工作正常在SQL服务器上,你可能是正确的,但我不使用MySQL,所以我不能测试,对你不幸 – 2014-12-07 01:40:03

4

我遇到了同样的问题,其次错误步通过与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); 
} 
+0

这为我做了诡计! – 2015-06-30 21:03:18

0

这是报告的bug与MySQL实体框架6.9.5

错误#74918: https://bugs.mysql.com/bug.php?id=74918

它已被固定在MySQL连接/网:与实体框架6不正确的查询结果6.7.7/6.8.5/6.9.6版本。

更改日志: 使用实体框架6,将字符串引用传递给“StartWith” 子句会返回不正确的结果。

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

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