Кастинг / Составление карт делегатов - PullRequest
0 голосов
/ 06 мая 2011

У меня есть метод

  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 () домена.Список пользователей.Является ли это возможным?заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Я почти уверен, что вы не можете сопоставить делегата другому делегату, но ваш код имеет еще больше проблем:

  • Если вы передадите Func<User, bool> в свой запрос Linq-to-entity, вы сделаететак же, как вы делаете сейчас.Он извлечет все данные из базы данных и выполнит фильтр в памяти вашего сервера приложений.Вы должны передать Expression<Func<User, bool>>, чтобы выполнить его на сервере БД.
  • Я не знаю всей вашей архитектуры и сложности приложения, но я чувствую, что размещение преобразования в DTO непосредственно в DAL не очень хорошо.Я могу представить себе это только в EFv1 при использовании EntityObjects.
0 голосов
/ 06 мая 2011

Если вы все еще принимаете участие в кастинге, вы можете найти более подробную информацию об этом здесь.

...