LINQ to SQL запрос по строковым параметрам

261
30 марта 2017, 17:44

дано: 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()

Answer 1

вот так:

 var users = con.Users.Where(p => p.Login.Equals(login)&&p.Password.Equals(password));

работает, хотя первоначальный вопрос, куда копать, остается открытым

Answer 2

По всей видимости, это ошибка EF Core на этапе оптимизации запроса. Попробуйте использовать другую версию библиотеки.

Если по какой-то причине обновиться нет возможности - следует использовать Workaround с вызовом метода Equals:

var users = from p in dbcon.Users where p.Login.Equals(login) && p.Password.Equals(password) select p;

PS если на последней версии библиотеки ошибка остается - ей самое место на гитхабе, в списке багов

Answer 3

Возможно, стоит сделать так:

        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; }
}
READ ALSO
file_id от файлов бота в telegram (php)

file_id от файлов бота в telegram (php)

Добрый день! Пишу бота для telegram на php, прицеплен через webhookБот уже умеет отправлять файлы через url

615
Временные интервалы в дате php

Временные интервалы в дате php

Доброго времени! Столкнулся с такой задачей, есть 2 переменные с датой и временем

319
Ошибка при создании формы по аннотациям [Syntax Error] Expected PlainValue, got &#39;$&#39; at position 78

Ошибка при создании формы по аннотациям [Syntax Error] Expected PlainValue, got '$' at position 78

Создаю сайт и потребовалось создать элемент формы select который бы выводил список всех пользователей для выбораСоздавать форму мне удобнее...

382