У меня есть метод
public List<DTO.User> GetUsers(Func<Domain.User, bool> expression)
{
var users = new List<DTO.User>();
using(UserContext context = new UserContext())
{
// obviously an error
users = context.Users.ToList();
}
return users;
}
Обратите внимание на DTO.User (DTO) и Domain.User (сущность домена из EF), поэтому я использую AutoMapper для сопоставления сущностей, подобных этой
public List<DTO.User> GetUsers()
{
var users = new List<DTO.User>();
using(UserContext context = new UserContext())
{
Mapper.CreateMap<Domain.User, DTO.User>();
users =
Mapper.Map<List<Domain.User>,List<DTO.User>>(context.Users.ToList());
}
return users;
}
Хорошо, это выглядит хорошо, но .. Я хочу, чтобы метод GetUser принял выражение делегата в качестве параметра.У меня есть сетка в пользовательском интерфейсе, которая отображает список пользователей, и она имеет много опций фильтрации, поэтому я хочу, чтобы мой пользовательский интерфейс просто вызывал 1 метод вместо создания метода для фильтра.
// filter by username
List<DTO.User> users = userBL.GetUsers(u => u.UserName.Contains(txtUserName.Text));
// filter by ID
List<DTO.User> users = userBL.GetUsers(u => u.== txtUserID.Text);
...
Итак, я придумалИдея, подобная этой, в моем слое DAL
public List<DTO.User> GetUsers(Func<DTO.User, bool> expression)
{
var users = new List<DTO.User>();
using(UserContext context = new UserContext())
{
Mapper.CreateMap<Domain.User, DTO.User>();
Func<Domain.User, bool> predicate;
// this is an error on AutoMaper
predicate = Mapper.Map<Func<DTO.User,bool>, Func<Domain.User, bool>>(expression)
// I also tried direct casting which is an obvious fail
//predicate = (Func<Domain.User,bool>)expression;
users =
Mapper.Map<Domain.User, DTO.User>(context.Users.Where(predicate).ToList());
}
return users;
}
В общем, я пытаюсь привести или преобразовать делегат DTO в домен delaget для его использования в методе .Where () домена.Список пользователей.Является ли это возможным?заранее спасибо.