【问题标题】:Converting expression to another?将表达式转换为另一个?
【发布时间】:2019-05-15 16:19:25
【问题描述】:

我有一个不知道如何解决的小挑战。

我需要从这个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 步:验证 第三步:执行

现在有两种方法可以通过 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&lt;Func&lt;TEntity,bool&gt;&gt;Expression&lt;Func&lt;TEntity, TRequest, bool&gt;&gt;

【问题讨论】:

  • 其余代码是什么样的?
  • “转换”是什么意思?这是两个不同的方法签名。如果要使用第二个,请将其分配给接受 TEntity 参数并返回 bool 的表达式。

标签: c# .net lambda .net-core expression-trees


【解决方案1】:

您不能简单地使用 lambda 表达式将表达式树转换为另一个。

只要指定 lambda 表达式的调用方未提供请求参数,请考虑使用Func&lt;URequest,Expression&lt;Func&lt;TEntity,bool&gt;&gt;&gt; 而不是Expression&lt;Func&lt;TEntity, URequest, bool&gt;&gt;

而 lambda 表达式看起来像这样

(request) =&gt; (enttiy) =&gt; entity.SomeProp == request.SomePropValue.

然后您的基类可以调用它来将“请求”对象绑定到表达式。

顺便说一句,前缀不是T 的通用参数名称是反模式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多