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>>DBサーバーで実行するには渡す必要があります。
  • アプリケーションのアーキテクチャと複雑さ全体はわかりませんが、DTO への変換を DAL に直接配置するのは良くないと感じています。を使用する場合、これを EFv1 でのみ行うことを想像できEntityObjectsます。
于 2011-05-06T07:49:36.700 に答える
0

まだデリゲートのキャストに興味がある場合は、ここで詳細情報を見つけることができます。

于 2011-05-06T08:06:31.677 に答える