方法があります
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() メソッドで使用しようとしています。出来ますか?前もって感謝します。