2017-01-13 2 views
2

У меня проблема с использованием метода Contains() с параметром, исходящим из аргументов метода.использовать параметр из метода аргумент внутри linq содержит

Я использую ядро ​​сущности Framework 1.1 и mysql-коннектор версии 6.10.0-alpha.

у меня есть этот код:

public IEnumerable<Message> search(string content) { 
    var bla = this.appDbContext.Messages.Where(x => x.Content.Contains("edit")).ToList(); 
    var bla1 = this.appDbContext.Messages.Where(x => x.Content=="edit").ToList(); 
    var bla2 = this.appDbContext.Messages.Where(x => x.Content==content).ToList(); 
    var bla3 = this.appDbContext.Messages.Where(x => x.Content.Contains(content)).ToList(); 
    ... 

первые 3 строки работает,

однако, четвертая строка (blÀ3) возвращает следующее сообщение об ошибке:

fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[0] An unhandled exception has occurred while executing the request System.InvalidOperationException: When called from 'VisitChildren', rewriting a node of type 'System.Linq.Expressions.Expression' must return a non-null value of the same type. Alternatively, override 'VisitChildren' and change it to not visit children of this type.

at System.Linq.Expressions.ExpressionVisitor.VisitAndConvert[T](ReadOnlyCollection'1 nodes, String callerName) at Microsoft.EntityFrameworkCore.Query.Expressions.SqlFunctionExpression.VisitChildren(ExpressionVisitor visitor) at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.ExpressionVisitorBase.VisitExtension(Expression node) at Microsoft.EntityFrameworkCore.Query.Expressions.SqlFunctionExpression.Accept(ExpressionVisitor visitor) at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ConditionalRemovingExpressionVisitor.Visit(Expression node) at Microsoft.EntityFrameworkCore.Query.Expressions.LikeExpression.VisitChildren(ExpressionVisitor visitor) at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.ExpressionVisitorBase.VisitExtension(Expression node) at Microsoft.EntityFrameworkCore.Query.Expressions.LikeExpression.Accept(ExpressionVisitor visitor) at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ConditionalRemovingExpressionVisitor.Visit(Expression node) at Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.VisitWhereClause(WhereClause whereClause, QueryModel queryModel, Int32 index) at Remotion.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection'1 bodyClauses, QueryModel queryModel) at Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel) at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.VisitQueryModel(QueryModel queryModel) at Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.VisitQueryModel(QueryModel queryModel) at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateQueryExecutor[TResult](QueryModel queryModel) --- End of stack trace from previous location where exception was thrown ---

почему не может Я использую параметр из аргументов метода внутри выражения Contains() linq?

и что я могу сделать, чтобы использовать его?

ответ

0

ошибка официально исправлена ​​в версии 6.10.1: https://www.nuget.org/packages/MySql.Data/6.10.1-beta

https://bugs.mysql.com/bug.php?id=84505

[9 Feb 21:17] Christine Cole

Posted by developer:

Fixed as of the upcoming MySQL Connector/NET 6.10.1 release, and here's the changelog entry:

EF Core: Using the Contains method in an expression with a variable generated an exception.

Thank you for the bug report.

и вот официальный релиз пост:

http://insidemysql.com/mysql-connectornet-6-10-1-beta-has-been-released/

Bugs Fixed

  • EF Core: Using the Contains method in an expression with a variable generated an exception. (Bug #25394204, Bug #84505)
0

Вот мое лучшее предположение для вас.

Когда вы используете LINQ to SQL и передаете параметризованный предикат в предложение Where, компилятор преобразует этот предикат в дерево выражений.

Ваш параметризованный предикат - x => x.Content.Contains(content).

Когда среда выполнения использует дерево выражений, существуют дополнительные ограничения. Вы видите исключение, которое выбрасывает VisitAndConvert.

В других трех случаях я полагаю, что компилятору не нужно использовать деревья выражений или использовать менее сложные, и в этом случае вы не видите ту же ошибку.

Если поставщик MySql не может справиться с этой сложностью деревьев выражений, тогда вы можете отфильтровать Messages в памяти, а не в запросе базы данных. Если есть много сообщений, это может заполнить вашу память, потому что вы будете получать ВСЕ сообщения из базы данных.

this.appDbContext.Messages 
    .ToList() // finish the call to the database 
    .Where(x => x.Content.Contains(content)) // then filter the data 
    .ToList(); 
+0

это хороший обходной путь, однако, как вы писали - в случае больших данных это заполнит память и не будет хорошо. Я только что написал официальный ответ, в котором говорится, что это настоящая ошибка, и что команда сообщества сущностей и команда соединителя mysql знают об этом. – shahaf

+0

Полезно знать. Благодарим за комментирование. Должен ли я удалить свой ответ? –

+0

Я не могу найти причину для его удаления, это может помочь кому-то, у кого нет большого количества данных и, следовательно, не будет проблем с памятью. Благодарю. – shahaf

1

По-видимому, это настоящая ошибка, а не то, что я пропустил, понимая, как работает структура сущности.

мы начали говорить об этом здесь в совете GitHub вопросов объектной фреймворки:

Неправильные генерации запроса при использовании Содержит внутри, где сказуемое.# 6687 https://github.com/aspnet/EntityFramework/issues/6687#issuecomment-272543460

, а затем он был разветвленным к MySQL ошибки форума:

Bug # 84505 Использование Содержит метод в выражении с переменной кидает исключение в EF Ядра http://bugs.mysql.com/bug.php?id=84505

и новая специальная проблема в вопросе управления github для организационной структуры:

Запрос: возможная ошибка вокруг условного удаления а также функции пользователя # 7441 https://github.com/aspnet/EntityFramework/issues/7441

надеюсь, что это исправится в ближайшее время.

Смежные вопросы