将表达式转换为另一个?
Converting expression to another?
我有一个小挑战,我不知道如何解决。
我需要从这个 Expression<Func<TEntity, URequest, bool>>
转换成这个 Expression<Func<TEntity, bool>>
。
第二个将用于查询数据源。
这个想法是有一个基础 class 构造函数,具有以下签名
abstract class Base
{
Base(Expression<Func<TEntity, TRequest, bool>> expression) { .... }
}
我可以在导出的东西中提供这样的表达式
class Derived : Base
{
Derived() :
base ((enttiy, request) => entity.SomeProp == request.SomePropValue) { }
}
这是由 Base 本身使用的
/// Ctor
Base(Expression<Func<TEntity, TRequest, bool>> expression)
{
_pipelineBuilder.AddFetchEntityStep (expression)
}
其中 AddFetchEntityStep 是管道中的一个步骤
管道看起来像这样。
第 1 步:获取实体
第 2 步:执行
第 3 步:验证
第 3 步:执行
现在有两种方法可以通过 Id 或另一个 属性 检索实体。
为此我有一个
ReadOnlyRepository
{
TEntity GetById<TEntity>(object id) { .... }
TEntity GetBy<TEntity>(Expression<Func<TEntity, bool>> expression) { .... }
在 AddFetchEntityStep 中,我进行了检查以了解要调用什么 Get,例如
public void AddFetchEntityStep (Expression<Func<TEntity, URequest, bool>> expression = null)
{
if (expression == null )
{
_repo.GetById<TEntity>(1)
}
else
{
_repo.GetBy(.....) //// The problem
}
}
我知道他们是两个不同的签名
Expression<Func<TEntity,bool>>
和 Expression<Func<TEntity, TRequest, bool>>
您不能简单地使用 lambda 表达式将表达式树转换为另一个表达式树。
只要请求参数不是由指定lambda表达式的调用者提供的,考虑使用Func<URequest,Expression<Func<TEntity,bool>>>
而不是Expression<Func<TEntity, URequest, bool>>
。
lambda 表达式看起来像这样
(request) => (enttiy) => entity.SomeProp == request.SomePropValue
.
然后你的基础 class 可以调用它来将 'request' 对象绑定到表达式。
顺便说一句,带有 T
以外前缀的通用参数名称是反模式。
我有一个小挑战,我不知道如何解决。
我需要从这个 Expression<Func<TEntity, URequest, bool>>
转换成这个 Expression<Func<TEntity, bool>>
。
第二个将用于查询数据源。
这个想法是有一个基础 class 构造函数,具有以下签名
abstract class Base
{
Base(Expression<Func<TEntity, TRequest, bool>> expression) { .... }
}
我可以在导出的东西中提供这样的表达式
class Derived : Base
{
Derived() :
base ((enttiy, request) => entity.SomeProp == request.SomePropValue) { }
}
这是由 Base 本身使用的
/// Ctor
Base(Expression<Func<TEntity, TRequest, bool>> expression)
{
_pipelineBuilder.AddFetchEntityStep (expression)
}
其中 AddFetchEntityStep 是管道中的一个步骤
管道看起来像这样。
第 1 步:获取实体 第 2 步:执行 第 3 步:验证 第 3 步:执行
现在有两种方法可以通过 Id 或另一个 属性 检索实体。
为此我有一个
ReadOnlyRepository
{
TEntity GetById<TEntity>(object id) { .... }
TEntity GetBy<TEntity>(Expression<Func<TEntity, bool>> expression) { .... }
在 AddFetchEntityStep 中,我进行了检查以了解要调用什么 Get,例如
public void AddFetchEntityStep (Expression<Func<TEntity, URequest, bool>> expression = null)
{
if (expression == null )
{
_repo.GetById<TEntity>(1)
}
else
{
_repo.GetBy(.....) //// The problem
}
}
我知道他们是两个不同的签名
Expression<Func<TEntity,bool>>
和 Expression<Func<TEntity, TRequest, bool>>
您不能简单地使用 lambda 表达式将表达式树转换为另一个表达式树。
只要请求参数不是由指定lambda表达式的调用者提供的,考虑使用Func<URequest,Expression<Func<TEntity,bool>>>
而不是Expression<Func<TEntity, URequest, bool>>
。
lambda 表达式看起来像这样
(request) => (enttiy) => entity.SomeProp == request.SomePropValue
.
然后你的基础 class 可以调用它来将 'request' 对象绑定到表达式。
顺便说一句,带有 T
以外前缀的通用参数名称是反模式。