Не удалось разобрать выражение «…: данные аргументы не соответствуют ожидаемым» - PullRequest
0 голосов
/ 08 сентября 2018

Я использую функцию CompiledQueries сущности framewok core 2.0, но даже если она не выдает синтаксическую ошибку, при запуске программы я получаю следующее исключение:

«Не удалось разобрать значение выражения» (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [TaskManager.Entities.EntitiesDB.USER]) AsNoTracking (). Где (__ condition) ': указанные аргументы не соответствуют Ожидаемые аргументы. Объект типа «System.Linq.Expressions.TypedParameterExpression» не может быть преобразован в тип «System.Linq.Expressions.LambdaExpression». "

Понятия не имею, что это. Мне нужна помощь.

Вот исходный код моего репозитория, который отображает эту ошибку:

    /// <summary>
    /// Query of user
    /// </summary>
    /// <param name="_context">context</param>
    /// <param name="conditions">conditions for clause "Where"</param>
    /// <returns>first task that meets the conditions or null </returns>
    private static Func<Context, Func<USER, bool>, Task<UserResponseDTO>> 
           _getUser = EF.CompileAsyncQuery (
               (Context _context, Func<USER, bool> conditions) =>
                  (conditions == null)? 
                      _context.USER.Select(user =>
                          new UserResponseDTO {
                            NAME = user.NAME,
                            EMAIL = user.EMAIL,
                            SEQUSER = user.SEQUSER,
                            DATEREGISTER = user.DATEREGISTER
                          }
                       ).AsNoTracking().FirstOrDefault ()
                  :                                        
                      _context.USER.AsNoTracking()
                      .Where(conditions).Select(user =>
                          new UserResponseDTO {
                            NAME = user.NAME,
                            EMAIL = user.EMAIL,
                            SEQUSER = user.SEQUSER,
                            DATEREGISTER = user.DATEREGISTER
                          }
                       ).FirstOrDefault ()
           );

мой класс, который реализует DbContext:

public class Context: DbContext
{
    public Context(DbContextOptions<Context> options): base(options){ }
    public virtual DbSet<USER> USER { get; set; }
    public virtual DbSet<TASK> TASK { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder){
        #region Sequences

        modelBuilder.HasSequence<long> 
        ("S_SEQUSER").StartsAt(1).HasMin(1);
        modelBuilder.HasSequence<long> 
        ("S_SEQTASK").StartsAt(1).HasMin(1);                   

        #endregion

        #region propeties Mapping
        modelBuilder.Entity<USER>()
            .Property(u => u.SEQUSER)                
            .HasDefaultValueSql(" nextval('\"S_SEQUSER\"') ");

        modelBuilder.Entity<TASK>()
           .Property(u => u.SEQTASK)            
           .HasDefaultValueSql(" nextval('\"S_SEQTASK\"') ");

        modelBuilder.Entity<USER>()
        .HasMany(u => u.TASK)
        .WithOne(u => u.USER);   
        #endregion        

        base.OnModelCreating(modelBuilder);
    }
}

мой объект базы данных:

/// <summary>
/// query user
/// </summary>
[Table(@"USER")]
public class USER
{
    #region Properties
    /// <summary>
    /// sequence of user
    /// </summary>
    /// <value></value>
    [Key()]
    [Column(@"SEQUSER")]
    public virtual long SEQUSER { get; set; }

    /// <summary>
    /// email of user
    /// </summary>
    /// <value></value>
    [Required]
    [StringLength(120)]
    [Column(@"EMAIL")]
    public virtual string EMAIL { get; set; }

    /// <summary>
    /// password of user
    /// </summary>
    /// <value></value>
    [Required]
    [StringLength(15)]
    [Column(@"PASSWORD")]
    public virtual string PASSWORD { get; set; }

    /// <summary>
    /// name of user
    /// </summary>
    /// <value></value>
    [Required]
    [StringLength(120)]
    [Column(@"NAME")]
    public virtual string NAME { get; set; }        

    /// <summary>
    /// date of user was registered
    /// </summary>
    /// <value></value>
    [Column(@"DATEREGISTER")]
    public virtual DateTime DATEREGISTER { get; set; }

    /// <summary>
    /// last acess of user in application
    /// </summary>
    /// <value></value>
    [Column(@"LASTACESS")]
    public virtual DateTime LASTACESS { get; set; }

    /// <summary>
    /// list of task 
    /// </summary>
    /// <value></value>
    [InverseProperty("USER")]
    public virtual List<TASK> TASK { get; set; }

    #endregion    
}

Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 08 сентября 2018

Попробуйте разбить его.

Начните с простого тестового примера (например, фиктивного new UserResponseDTO), затем попробуйте с помощью простого статического выбора (выберите одного конкретного пользователя), затем добавьте условие if / else и попробуйте с и без conditions, затем добавьте простой статический выбор к вашей первой ветви if / else, затем сделайте то же самое для второй ветви, пока не дойдете до того оператора, который у вас есть прямо сейчас.

Вы также можете сначала сделать выбор (без if / else), чтобы проверить, находится ли ваша проблема в определении контекста. Может быть, в одной из строк, содержащих " nextval('\"S_SEQUSER\"') " или " nextval('\"S_SEQTASK\"') ". Кстати: почему здесь пробелы?

Где-то между ними что-то пойдет не так. Разница в том, что теперь вы знаете, где; -)

И определенно напишите для этого юнит-тест. Обычно это всего лишь щелчок правой кнопкой мыши.

...