Basi c Type-Generi c EF Core 3.1 -> SQL Сервер, где невозможно перевести предложение - PullRequest
1 голос
/ 23 января 2020

Используя EF Core, независимо от того, что я делаю, я не могу получить лямбду в операторе Where для правильной оценки SQL. У меня есть базовый c generi c LINQ-запрос, который принимает аргумент типа T where T :class, ICommonModel, он переводится через репозиторий, который возвращает IQueryable of TCommon where TCommon : :class, ICommonModel, но под капотом используется TData where TData : :class, IDataModel. Я не совсем уверен, где именно происходит сбой, но, несмотря на то, что он не может обработать что-либо в предложении Where.

Вот метод с предложением Where.

public virtual async Task<IEnumerable<T>> GetAsync(IEnumerable<Guid> ids)
            => await this.repository.Read().Where(r => ids.Contains(r.Id)).ToListAsync();

Вот еще более простое утверждение, которое по-прежнему не выполняется, поэтому оно не связано с вызовом Contains, как первоначально предполагалось.

public virtual async Task<IEnumerable<T>> GetAsync(IEnumerable<Guid> ids)
            => await this.repository.Read().Where(r => r.Id.ToString().Contains("0")).ToListAsync();

Я получаю ошибку

System.InvalidOperationException
  HResult=0x80131509
  Message=The LINQ expression 'DbSet<Person>
    .Where(p => new Person{ 
        ContactNumber = p.ContactNumber, 
        Email = p.Email, 
        FullName = p.FullName, 
        Id = p.Id 
    }
    .Id.ToString().Contains("0"))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
  Source=Microsoft.EntityFrameworkCore

Вот метод Repo

        public virtual IQueryable<TCommon> Read()
            => this.Context.Set<TData>().ProjectTo<TCommon>(this.Mapper.ConfigurationProvider);

Интерфейс для обоих методов идентичен.

    public interface IDataModel {

        Guid Id { get; set; }
    }
...
    public interface ICommonModel {
        Guid Id { get; set; }
    }
...