Bug #74943 | 6.9.5 broke Contains, StartWith in Linq with EF 6 | ||
---|---|---|---|
Submitted: | 20 Nov 2014 19:18 | Modified: | 9 Dec 2014 9:42 |
Reporter: | Bart Calixto | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | Connector / NET | Severity: | S1 (Critical) |
Version: | 6.9.5 | OS: | Windows |
Assigned to: | CPU Architecture: | Any |
[20 Nov 2014 19:18]
Bart Calixto
[21 Nov 2014 12:20]
Van Fem
Affects StartsWith, Contains, EndsWith Affects EF6, EF5 Affects Connector/NET 6.9.5, 6.8.4, 6.7.6: those with update note "Generated code that matched against the start of a VARCHAR/CHAR column now correctly uses "LIKE" instead of location functions..."
[21 Nov 2014 12:30]
Van Fem
This is caused by the parameter being enclosed in quotes like so: '%p__linq__0%' This causes MySQL to search for strings containing "p__linq__0", and will return them if you have any in database.
[21 Nov 2014 20:46]
Bart Calixto
Workaround : instead of doing .Where(x => x.name.Contains(text) doing .Where(x => x.name.Contains(text.Trim()) // or ToLower() does returns correct results.
[24 Nov 2014 3:33]
Aaron Clauson
I can verify this issue as well. Windows 7, MySql.Data & MySql.Data.Entity.EF6 6.9.5, MySQL DB 5.6.15.
[27 Nov 2014 10:37]
Damien DALY
I have downloaded the source code and maybe I have found something : - In the project "MySql.Data.Entity", the file Generators\SqlGenerator.cs - In the function protected LikeFragment TryPromoteToLike(DbExpression left, DbExpression right, string op) There are 3 lines for the 3 LIKE patterns, like this one : // Pattern LIKE "%..." in EF6 like.Pattern = new LiteralFragment(string.Format("'%{0}'", par.ParameterName)); I think it may be replaced with something like this : like.Pattern = new LiteralFragment(string.Format("'%' + @{0}", par.ParameterName)); So the executed query would work as excepted.
[27 Nov 2014 13:14]
Andrej Gerbec
Caught it on 6.9.5. I'm in tears.
[5 Dec 2014 8:41]
Thomas L.
I can confirm this on 6.9.5 with EF6, code is like this: foreach (var searchTerm in searchTermList) { string term = searchTerm; articles = articles.Where(d => d.DescriptionLong.Contains(term) || d.Ident.Contains(term) || d.SchematicReference.Contains(term) || d.FootprintReference.Contains(term)); } If the only searchTerm in searchTermList is "WI100", no elements will be found. If I replace "term" with the string "WI100" all 233 elements will be found correctly. Really?!?!?
[5 Dec 2014 14:28]
Bart Calixto
Thomas L. : Yes, worst part is silence from MySql team. Get used to this or switch asap to other SQL. As I see this is getting only worse each time.
[9 Dec 2014 9:42]
Chiranjeevi Battula
Hello Bart Calixto, Thank you for the bug report. This is duplicate of Bug #74918. Thanks, Chiranjeevi.