我有一个方法
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 方法接受委托表达式作为参数。我在 ui 中有一个显示用户列表的网格,它有许多过滤选项,所以我希望我的 UI 只调用 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 委托强制转换或映射到 Domain delaget,以便在 domain.User 列表的 .Where() 方法中使用它。是否可以?提前致谢。