我有一个小挑战,我不知道该如何解决。
我需要从此Expression<Func<TEntity, URequest, bool>>
转换为Expression<Func<TEntity, bool>>
。
第二个将用于查询数据源。
这个想法是,它具有一个带有以下签名的基类构造函数
abstract class Base
{
Base(Expression<Func<TEntity, TRequest, bool>> expression) { .... }
}
我可以在派生类中提供一个表达式
class Derived : Base
{
Derived() :
base ((enttiy, request) => entity.SomeProp == request.SomePropValue) { }
}
这是基地使用的
/// Ctor
Base(Expression<Func<TEntity, TRequest, bool>> expression)
{
_pipelineBuilder.AddFetchEntityStep (expression)
}
AddFetchEntityStep是管道中的步骤
管道看起来像这样。
步骤1:FetchEntity 步骤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>>
答案 0 :(得分:4)
您不能简单地使用lambda表达式将表达式树转换为另一棵树。
只要指定lambda表达式的调用者未提供request参数,请考虑使用Func<URequest,Expression<Func<TEntity,bool>>>
而不是Expression<Func<TEntity, URequest, bool>>
。
lambda表达式看起来像这样
(request) => (enttiy) => entity.SomeProp == request.SomePropValue
。
然后您的基类可以调用它来将“请求”对象绑定到表达式。
顺便说一句,前缀为T
以外的通用参数名称是反模式。