дано: EF Core 1.0.1 и следующие классы:
public class User
{
public int UserId {get;set;}
public string Login {get;set;}
public string Password {get;set;}
}
public class DataContext:DbContext
{
public DbSet<User> Users { get; set; }
}
в следующем коде
Datacontext dbcon = new DataContext();
var users = from p in dbcon.Users where p.Login=="login1" &&
p.Password=="pass1" select p;
int number = users.Count();
возникает ошибка
InvalidOperationException: The operands for operator 'Equal' do not match the parameters of method 'op_Equality'.
почему так происходит? что нужно сделать? полное описание исключения:
System.InvalidOperationException: The operands for operator 'Equal' do not match the parameters of method 'op_Equality'.
at System.Linq.Expressions.Expression.GetMethodBasedBinaryOperator(ExpressionType binaryType, Expression left, Expression right, MethodInfo method, Boolean liftToNull)
at System.Linq.Expressions.Expression.Equal(Expression left, Expression right, Boolean liftToNull, MethodInfo method)
at System.Linq.Expressions.Expression.MakeBinary(ExpressionType binaryType, Expression left, Expression right, Boolean liftToNull, MethodInfo method, LambdaExpression conversion)
at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.NavigationRewritingExpressionVisitor.VisitBinary(BinaryExpression node)
at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.NavigationRewritingExpressionVisitor.VisitBinary(BinaryExpression node)
at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Remotion.Linq.Clauses.WhereClause.TransformExpressions(Func`2 transformation)
at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.NavigationRewritingExpressionVisitor.NavigationRewritingQueryModelVisitor.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.ExpressionVisitors.Internal.NavigationRewritingExpressionVisitor.Rewrite(QueryModel queryModel, QueryModel parentQueryModel)
at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.OptimizeQueryModel(QueryModel queryModel)
at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateQueryExecutor[TResult](QueryModel queryModel)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](Expression query, INodeTypeProvider nodeTypeProvider, IDatabase database, ILogger logger, Type contextType)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass19_0`1.<CompileQuery>b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
at SolidCRMCore.Startup.<>c.<<Auth>b__2_0>d.MoveNext() in C:\Users\ib\documents\visual studio 2017\Projects\SolidCRMCore\SolidCRMCore\Startup.cs:line 78
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()
вот так:
var users = con.Users.Where(p => p.Login.Equals(login)&&p.Password.Equals(password));
работает, хотя первоначальный вопрос, куда копать, остается открытым
По всей видимости, это ошибка EF Core на этапе оптимизации запроса. Попробуйте использовать другую версию библиотеки.
Если по какой-то причине обновиться нет возможности - следует использовать Workaround с вызовом метода Equals:
var users = from p in dbcon.Users where p.Login.Equals(login) && p.Password.Equals(password) select p;
PS если на последней версии библиотеки ошибка остается - ей самое место на гитхабе, в списке багов
Возможно, стоит сделать так:
DataContext dbcon = new DataContext(); // обрати внимание на эту строку, у тебя написано Datacontext вместо DataContext
var users = from p in dbcon.Users
where p.Login.Equals("login1") &&
p.Password.Equals("pass1")
select p;
int number = users.Count();
И еще, как я понимаю, класс DataContext должен выглядеть так:
public class DataContext: DbContext
{
public DbSet<Call> Calls { get; set; }
public DbSet<User> Users { get; set; }
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей