背景:アプリケーションには複数のレイヤーがあり、そのうちの2つはドメインレイヤーとDALとして機能するインフラストラクチャレイヤーです。ドメイン層では、次のような汎用リポジトリパターンを実装しました。
public interface IRepository<T, in TId> where T : IEntity<TId>
{
void Insert(T entity);
void Delete(T entity);
IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
T GetById(TId id);
}
私のDALには、一般的なDAOパターンが次のように実装されています。
public interface IDao<TEntity> where TEntity : class
{
IQueryable<TEntity> Select();
IQueryable<TEntity> GetAll();
IQueryable<TEntity> Where(Expression<Func<TEntity, bool>> predicate);
TEntity GetSingle(Expression<Func<TEntity, bool>> predicate);
TEntity GetFirst(Expression<Func<TEntity, bool>> predicate);
void Add(TEntity entity);
void Delete(TEntity entity);
void Attach(TEntity entity);
}
私は、ビジネス用語で個人を表すドメインクラスを持っています。DALレイヤーには、データベース内のオブジェクトを表すために使用される同様の個別のオブジェクトがあります。IDAOインターフェイスを実装し、そのDAOインターフェイスで見つかったすべてのアクション(CRUDおよび上記のその他のアクション)を担当するEntityFrameworkDaoというクラスがあります。
リポジトリで使用されている式をDALで使用されている式にマップする方法を見つけようとしています(何日も試しています)。具体的な例は次のとおりです。IRepositoryインターフェイスを実装する汎用DomainRepositoryがあります(上記を参照)。SearchForメソッドは次のようになります。
public IQueryable<TDomainEntity> SearchFor(Expression<Func<TDomainEntity, bool>> predicate)
{
var convertedExpression = **SomeMagicFunctionToConvertExpressions**();
var dataEntities = _dao.Where(convertedExpression);
return AutoMapper.Mapper.Map<IEnumerable<TEfEntity>, IEnumerable<TDomainEntity>>(dataEntities).AsQueryable();
}
ドメインレイヤーの述語を、IDaoを実装するDALクラスでWhereメソッドが理解できるものに変換できるように、SomeMagicFunctionToConvertExpressionsが何であるかを理解する必要があります。
public IQueryable<TEfEntity> Where(Expression<Func<TEfEntity, bool>> predicate)
{
return _context.Set<TEfEntity>().Where(predicate).AsQueryable();
}
この記事にあるAutomapperのCreateMapExpressionを使用してみました:セレクタータイプ間のFuncのAutoMapper
しかし、それは、式から式へではなく、Func<DomainType,bool>
述語から(述語)への変換方法を教えてくれるだけです。Func<DTOType,bool>
私はこのようなものを変換する方法を探しています:
Expression<Func<TDomainEntity, bool>> predicate
これに:
Expression<Func<TDAOEntity, bool>> predicate
式ツリーの変更に関するこの記事を見つけた後、何かに取り組んでいると思いましたが、&&または||を含む複雑なlinq式を渡すことができません。または、単純なi => i.id.Equals(12345)タイプのクエリよりも複雑なもの。
私はAutomapperを使用しているので、それを使用しているsolutoinはどれも素晴らしいでしょうが、現時点ではどんなアイデアも受け入れています。私は本当に立ち往生していて、これを何日も研究しています。これはかなり一般的なタスクのようです。タイプに基づくクエリを、アーキテクチャ内の1つのレイヤーからDALで使用されるタイプに変換します。
よろしくお願いします。