假设:
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包含实体的所有属性加上一些。
答案 0 :(得分:2)
我没有准确的代码,但您可能希望使用提供的表达式并自行执行等效转换。
This stackoverflow question与我的目标一致。
P.Brian.Mackey的注释
提到的答案有效。使用Jon的答案就可以了。但是,答案的公开部分最终成为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)
答案 1 :(得分:1)
让他们共享一个共同的界面:
public interface ISited {
int SiteId {get; set; }
}
class MyDao : ISited { .. }
class MyEntity : ISited { .. }
并使用公共接口作为泛型类型参数的约束来代替C3VAddressDao
:
public ISited ReadSingle(Expression<Func<ISited, bool>> predicate)
当然,如果没有您在ISited
中包含的其他常见成员,这可能没那么有用。
答案 2 :(得分:0)
为什么不在
中传递它public Cv3AddressDao ReadSingle<TEntity>(Expression<Func<TEntity, bool>> predicate)
{
// ...
}
...
var dao = new MyDao();
var addr = dao.ReadSingle<MyEntity>(x => x.SiteId == 1);
答案 3 :(得分: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之类的东西在两种类型之间定义自定义转换。