C# 转换函数<;TDao、bool>;to Func<;TEntity,bool>;

C# 转换函数<;TDao、bool>;to Func<;TEntity,bool>;,c#,C#,鉴于: 类MyDao { public int SiteId{get;set;} 公共Cv3AddressDao ReadSingle(表达式谓词) { //... } } 类实体 { public int SiteId{get;set;} } 如何获取Expression类型的谓词参数并将其转换为Expression 我正在寻找的答案类型 请注意,答案必须说明转换是如何工作的。我想要一个与此类似的实现,但它可以工作:) public MyDao ReadSingle(表达式谓词) { var

鉴于:

类MyDao
{
public int SiteId{get;set;}
公共Cv3AddressDao ReadSingle(表达式谓词)
{ //...
}
}
类实体
{
public int SiteId{get;set;}
}
如何获取
Expression
类型的谓词参数并将其转换为
Expression

我正在寻找的答案类型

请注意,答案必须说明转换是如何工作的。我想要一个与此类似的实现,但它可以工作:)

public MyDao ReadSingle(表达式谓词)
{
var mappedperedicate=MapFun(谓词);
var result=repository.GetSingle(mappedPredicate);
返回Convert(result);//将实体转换为Dao…可以安全地忽略此行
}
表达式MapFun(表达式输入)
{
Expression result=null;//如何转换?
返回结果;
}
有关我为什么需要此设计的详细信息…

这是一个asp.NETMVC5应用程序。此转换之所以重要,是因为我的视图不知道类型
MyEntity
。换句话说,如果我要做:

myDaoObject.ReadSingle(myEntity=>myEntity.SiteId==“123”)

然后我的视图层必须引用我的DLL层,因为这里我使用的是
MyEntity
。我希望视图层与Dao一起工作:

myDaoObject.ReadSingle(myDao=>myDao.SiteId==“123”)

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

为什么不把它传过来

    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;
    }
public Cv3AddressDao ReadSingle(表达式谓词)
{
// ...
}
...
var dao=新的MyDao();
var addr=dao.ReadSingle(x=>x.SiteId==1);
为什么不把它传进来

    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;
    }
public Cv3AddressDao ReadSingle(表达式谓词)
{
// ...
}
...
var dao=新的MyDao();
var addr=dao.ReadSingle(x=>x.SiteId==1);

让他们共享一个公共界面:

public Cv3AddressDao ReadSingle<TEntity>(Expression<Func<TEntity, bool>> predicate)
{
    // ...
}
...
var dao = new MyDao();
var addr = dao.ReadSingle<MyEntity>(x => x.SiteId == 1);
并使用公共接口作为泛型类型参数的约束,以代替
C3VAddressDao

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

class MyDao : ISited { .. }
class MyEntity : ISited { .. }
public-ISited-ReadSingle(表达式谓词)

当然,如果没有其他常见成员,这可能没有多大用处,您可以在
中包含这些成员,并让它们共享一个公共界面:

public Cv3AddressDao ReadSingle<TEntity>(Expression<Func<TEntity, bool>> predicate)
{
    // ...
}
...
var dao = new MyDao();
var addr = dao.ReadSingle<MyEntity>(x => x.SiteId == 1);
 public ISited ReadSingle(Expression<Func<ISited, bool>> predicate)
并使用公共接口作为泛型类型参数的约束,以代替
C3VAddressDao

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

class MyDao : ISited { .. }
class MyEntity : ISited { .. }
public-ISited-ReadSingle(表达式谓词)
当然,如果没有在
ISited

publicstaticexpressionmapfun)中包含的其他常见成员,这可能没有多大用处

 public ISited ReadSingle(Expression<Func<ISited, bool>> predicate)
另一个选项是使用IConvertable之类的工具定义两种类型之间的自定义转换。

public static Expression MapFun)


另一个选项是使用IConvertable之类的工具定义两种类型之间的自定义转换。

我手头没有确切的代码,但您可能希望使用提供的表达式并自己执行等价转换

这就是我要做的

来自p.Brian.Mackey的注释

提到的答案奏效了。用乔恩的答案就行了。然而,答案的公共部分最终成为
Func
转换的不可见玩家。我所需要的只是:

    public static Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input) where A : class
    {
        return b => input.Compile()((b as A));
    }
Expression-MapFun(表达式输入),其中A:class
{
var result=DbAccessLayer.TransformPredicateLambda(输入);
返回结果;
}
请注意,此方法是私有的。我把它改成了公共的。有关完整的实现,请参见上面引用的答案中的@Jon answer

    Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input)where A : class
    {
        var result = DbAccessLayer.TransformPredicateLambda<A,B>(input);
        return result;
    }
公共静态表达式TransformPredicateLambda(表达式谓词)

我手头没有确切的代码,但您可能希望使用提供的表达式并自己执行等价转换

这就是我要做的

来自p.Brian.Mackey的注释

提到的答案奏效了。用乔恩的答案就行了。然而,答案的公共部分最终成为
Func
转换的不可见玩家。我所需要的只是:

    public static Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input) where A : class
    {
        return b => input.Compile()((b as A));
    }
Expression-MapFun(表达式输入),其中A:class
{
var result=DbAccessLayer.TransformPredicateLambda(输入);
返回结果;
}
请注意,此方法是私有的。我把它改成了公共的。有关完整的实现,请参见上面引用的答案中的@Jon answer

    Expression<Func<B, bool>> MapFun<A, B>(Expression<Func<A, bool>> input)where A : class
    {
        var result = DbAccessLayer.TransformPredicateLambda<A,B>(input);
        return result;
    }
公共静态表达式TransformPredicateLambda(表达式谓词)

您可以向我们展示您调查和尝试的内容吗?@Default-Question使用接近我需要的实现进行更新。您可以向我们展示您调查和尝试的内容吗?@Default-Question使用接近我需要的实现进行更新。这将导致我的视图层与数据层耦合。刀的意义在于,我没有这种耦合。即使进行了更新,也需要在视图中定义lamba。我看不出这是怎么回事。@P.Brian.Mackey如果你的问题中没有提到层,也许你应该更新你的问题,以便清楚你的要求是什么。在你详细说明你的应用程序架构之前,很难修改我的答案。我更新了这个问题。希望这会把事情弄清楚。这将导致我的视图层和数据层的耦合。刀的意义在于,我没有这种耦合。即使进行了更新,也需要在视图中定义lamba。我不知道这是怎么回事。@P.Brian.Mackey如果你的问题中没有提到图层,也许你应该更新你的qu