2

与えられた:

class MyDao
{
   public int SiteId {get;set;}

   public Cv3AddressDao ReadSingle(Expression<Func<Cv3AddressDao, bool>> predicate)
   { //...
   }
}

class MyEntity
{
   public int SiteId {get;set;}
}

タイプの述語パラメータを取得して、Expression<Func<MyDao, bool>>それを に変換するにはどうすればよいExpression<Func<MyEntity, bool>>ですか?

探している回答のタイプ

回答は、変換がどのように機能するかを示す必要があることに注意してください。これに似た実装が欲しいのですが、うまくいきます:)...

    public MyDao ReadSingle(Expression<Func<MyDao , bool>> predicate)
    {
        var mappedPredicate = MapFun<MyDao , MyEntity>(predicate);
        var result = repository.GetSingle<MyEntity>(mappedPredicate);

        return Convert(result);//Converts Entity to Dao...safe to ignore this line
    }

    Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input)
    {
        Expression<Func<B, bool>> result = null;//How to convert?
        return result;
    }

このデザインが欲しい理由の詳細...

これは asp.net MVC 5 アプリケーションです。この変換が重要な理由は、ビューが type を認識しないためMyEntityです。言い換えれば、私がやった場合:

myDaoObject.ReadSingle<MyEntity>(myEntity => myEntity.SiteId == "123");

ここでは を使用しているため、View レイヤーは DLL レイヤーを参照する必要がありますMyEntity。代わりに、View レイヤーを Dao と連携させたい:

myDaoObject.ReadSingle<MyDao>(myDao=> myDao.SiteId == "123");

しかし、今度は Dao を変換してリポジトリで使用できるようにする必要があります。リポジトリは DL オブジェクトのみを認識します。この翻訳をサポートするためだけに冗長なリポジトリを作成しないようにしています。DAO には、エンティティのすべてのプロパティといくつかのプロパティが含まれています。

4

4 に答える 4

0
    public static Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input) where A : class
    {
        return b => input.Compile()((b as A));
    }

パラメータを変換しているだけなので、これでうまくいくはずです。

アップデート:

更新された回答に基づいて、いくつかのオプションがあります。

リフレクションを使用して、エンティティから DAO に値をコピーします ( AutoMapperのようなものを見てください) 。

あなたが持っている他のオプションは、IConvertable のようなものを使用して、2 つの型の間のカスタム変換を定義することです。

于 2013-08-16T15:26:23.047 に答える