0

我有一个方法

  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() 方法中使用它。是否可以?提前致谢。

4

2 回答 2

1

我几乎可以肯定您不能将委托映射到另一个委托,但您的代码还有更多问题:

  • 如果您传递Func<User, bool>到您的 Linq-to-entities 查询,您将执行与现在相同的操作。它将从数据库中提取所有数据并在应用程序服务器的内存中执行过滤器。您必须通过Expression<Func<User, bool>>才能在数据库服务器上执行它。
  • 我不知道整个应用程序的架构和复杂性,但我觉得直接在 DAL 中转换为 DTO 并不好。我可以想象只在 EFv1 中使用EntityObjects.
于 2011-05-06T07:49:36.700 回答
0

如果您仍然喜欢铸造代表,您可以在此处找到更多相关信息

于 2011-05-06T08:06:31.677 回答