Используя 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; }
}