1

私の質問に投票してクローズする

同様の質問と、クラスを使用した非常に役立つ回答を見つけました ExpressionVisitor(リンク: How can I convert a lambda-expression between different (but compatible) models? )。ありがとうございました。私の回答が重複して閉鎖されることに投票しています。投票も検討してください。

コード

以下のコードのように、データ転送オブジェクトを使用するリポジトリ コードを開発しています。

public class UsuarioRepositorio : IUsuarioRepository
{
    private readonly MongoRepository<UsuarioDto> _Repository;

    public UsuarioRepository(string connectionString)
    {
        _Repositorio = new MongoRepository<UsuarioDto>(connectionString, "");
    }
}

public interface IUsuarioRepository
{  
    IEnumerable<T> Select(Expression<Func<Usuario, bool>> predicate);
}
  • UsuarioDtoはUsuarioクラスのデータ転送オブジェクトであり、どちらもインターフェイスIUsuarioから継承しています。

  • UsuarioRepositoryはIUsuarioRepositoryインターフェイスを実装し、型に属する _Repository というプライベート メンバーを持ちますMongoRepository<UsuarioDto>

  • _Repositoryメンバーには、 type の引数を受け入れる Select というメソッドがありますExpression<Func<UsuarioDto, bool>>

  • IUsuarioRepositoryには、type の引数を受け入れるSelectという宣言済みメソッドがありますExpression<Func<Usuario, bool>>


問題

問題は、SelectメソッドをUsuarioRepositoryに実装し、 IUsuarioRepositoryメソッド シグネチャを使用して、同じ引数のパラメーターを持つ型の新しい式を_Repositoryに渡す必要があることです。Expression<Func<UsuarioDto, bool>>Expression<Func<Usuario, bool>>

基本的に、式のパラメーターを異なる型の新しい式にコピーする方法が必要です。これらの式は同じインターフェイス継承を持っているため、同じプロパティを持っていることがわかっています。このようなもの:

public IEnumerable<Usuario> Select(Expression<Func<Usuario, bool>> predicate)
{
    Expression<Func<UsuarioDto, bool>> transferExpression = x => x != null;
    transferExpression = transferExpression .Update(predicate.Body, predicate.Parameters);

    return _Repository.Select(transferExpression ).ToList().Select(x => x.ToDomain());
}


質問

  • タイプのUpdateメソッドはExpression上記のコードのように機能しますか?
  • それが機能しない場合、異なるタイプの式をコピーする方法はありますが、同じベース/インターフェイス プロパティを使用していますか?

どうもありがとうございました!

4

1 に答える 1