繁体   English   中英

转换功能 <TDao, bool> 到功能 <TEntity, bool>

[英]Convert Func<TDao, bool> to Func<TEntity, bool>

鉴于:

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应用程序。 进行此转换很重要的原因是,这样我的View不会知道MyEntity类型。 换句话说,如果我要这样做:

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

然后,我的View层必须引用我的DLL层,因为在这里我使用的是MyEntity 我希望View图层改为与Dao一起使用:

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

但是,现在我必须转换Dao以使其可在存储库中使用。 存储库仅知道DL对象。 我试图避免创建仅用于支持此翻译的冗余存储库。 DAO包含实体的所有属性以及一些属性。

我没有确切的代码,但是您可能想使用提供的表达式并自己执行等效转换。

这个stackoverflow问题与我将要做的事情类似。

P.Brian.Mackey的笔记

提到的答案有效。 使用乔恩的答案就可以了。 但是,答案的公开部分最终成为Func<>转换的不可见播放器。 我需要的是:

    Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input)where A : class
    {
        var result = DbAccessLayer.TransformPredicateLambda<A,B>(input);
        return result;
    }

请注意,此方法是私有的。 我将其更改为公开。 有关完整实现,请参见上面引用的答案中的@Jon答案。

public static Expression<Func<TNewTarget, bool>> TransformPredicateLambda<TOldTarget, TNewTarget>(Expression<Func<TOldTarget, bool>> predicate)

让它们共享一个公共接口:

public interface ISited {
    int SiteId {get; set; }
}

class MyDao : ISited { .. }
class MyEntity : ISited { .. }

并使用通用接口代替C3VAddressDao作为对通用类型参数的C3VAddressDao

 public ISited ReadSingle(Expression<Func<ISited, bool>> predicate)

当然,如果没有ISited包含的其他常见成员,这可能没有什么用处。

为什么不通过

public Cv3AddressDao ReadSingle<TEntity>(Expression<Func<TEntity, bool>> predicate)
{
    // ...
}
...
var dao = new MyDao();
var addr = dao.ReadSingle<MyEntity>(x => x.SiteId == 1);
    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之类的东西在两种类型之间定义自定义转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM