私の質問に投票してクローズする
同様の質問と、クラスを使用した非常に役立つ回答を見つけました
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
上記のコードのように機能しますか? - それが機能しない場合、異なるタイプの式をコピーする方法はありますが、同じベース/インターフェイス プロパティを使用していますか?
どうもありがとうございました!