Я использую шаблон репозитория, поэтому мой репозиторий просто знает о DTO. Он должен запрашивать базу данных с помощью некоторых фильтров, используя Entity Framework. Моя проблема в том, что Entity Framework знает только о классах модели БД, поэтому мне нужно «автоматизировать» Выражение, прежде чем я смогу использовать их в любом запросе.
Я объявил метод, который принимает Выражение в качестве фильтра.
public interface IRepository
{
IEnumerable<ItemDTO> GetItemsWithFilter(Expression<Func<ItemDTO, bool>> filter)
{
var filterDb = Mapper.Map<Expression<Func<ItemDB, bool>>>(filter);
return dbContext.CONFIGURATIONS.Where(filterDb).Select(x => Mapper.Map<ItemDTO>(x));
}
}
public class ItemDTO
{
public int numero { get; set; }
public string name { get; set; }
}
public class ItemDB //they are both the same, just for testing purpose
{
public int numero { get; set; }
public string name { get; set; }
}
//failing code
Repository.GetItemsWithFilter(x => x.name= = "a");
Я следил за руководство, в котором говорится, что можно сопоставить выражения, но я получаю некоторые ошибки:
"The specified type member 'name' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}
Я уже проверил это, но не могу заставить его работать, и я не знаю, почему
Рассмотрите возможность публикации минимальный воспроизводимый пример. Исключение не может быть сгенерировано текущим предоставленным кодом, потому что нигде в опубликованных моделях сущности / DTO нет свойства Description.
@IvanStoev, ты прав. Я попытался опубликовать минимальный код, но набрал неправильное имя переменной. Теперь я исправил это





Я решил это, включив этот вызов метода расширения:
Mapper.Initialize(cfg => {
cfg.AddExpressionMapping();
// Rest of your configuration
});
Не забудьте установить пакет nuget AutoMapper.Extensions.ExpressionMapping
Install-Package AutoMapper.Extensions.ExpressionMapping