У меня есть следующий код, который работает без ошибок, пока я не раскомментирую прокомментированную строку.
var viewModel = new ArticlesListViewModel
{
Articles = await _context.Articles.Select(article =>
_mapper.Map<ArticleLookupModel>(article)
)
// .Where(x => x.Title.ToLower().Contains(request.PagingModel.QueryFilter.ToLower()))
.Skip((request.PagingModel.PageNumber - 1) * request.PagingModel.PageSize).Take(request.PagingModel.PageSize)
.ToListAsync(cancellationToken)
};
Если я раскомментировал, при сопоставлении я получаю следующее исключение:
The LINQ expression 'DbSet<Article>
.Where(a => ___mapper_0.Map<ArticleLookupModel>(a).Title.ToLower().Contains(__ToLower_1))' 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().
Мой профиль автомаппера следующий, где свойство Title - это не что иное, как обычная строка:
public class ArticleProfile : Profile
{
public ArticleProfile()
{
CreateMap<Article, ArticleLookupModel>()
.ForMember(title=>title.Title, conf=>conf.MapFrom(dto=>dto.Title));
}
}
Я знаю, что мне нужно где-то объявить что-то вроде этого (я не уверен если он правильный или полный)
Expression<Func<Article, bool>> dtoExpression = dto => dto.Title.ToLower().Contains(request.PagingModel.QueryFilter.ToLower());
var expression = _mapper.Map<Expression<Func<ArticleLookupModel, bool>>>(dtoExpression);
Я хочу провести сравнение строк, игнорируя регистр (вот почему я вызываю метод ToLower ()). Однако я не знаю, что мне делать с этими двумя строками кода, как добавить его в конфигурацию.
Может кто-нибудь? Я хочу выполнить сопоставление при создании списка асинхронно для повышения производительности. Я не хочу, чтобы я создавал список сопоставленных моделей, а затем повторял его снова и принимал то, что соответствует моему состоянию.
Большое спасибо!