【问题标题】:Sum of two expressions that return a number [duplicate]返回数字的两个表达式的总和[重复]
【发布时间】:2014-07-30 11:53:57
【问题描述】:

我有一个列表和一个简单定义如下的查询:

var list = new List<int>();

for (var i = 0; i < 4; i++)
{
    list.Add(i);
}

var query = list.AsQueryable();

现在我有一个Expression,它返回数字的平方:

private static Expression<Func<int, int>> Square()
{
    return i => i * i;
}

第三次幂是这样的:

private static Expression<Func<int, int>> Third()
{
    return i => i * i * i;
}

我想要的是能够在Select 表达式中使用类似于此伪代码的代码选择这些的总和:

var result = query.Select(Square() + Third()).ToList();

我希望结果是

0
2
12
36

有没有办法轻松实现,或者我应该以其他方式做到这一点?

附:请记住,为了便于定义问题,方法已简化为强调。

附:我正在使用表达式,因为这是 Linq-to-entities 问题的过度简化示例,并且我知道我只能使用 IQueryablethis topic

【问题讨论】:

  • 应该叫Cube(),而不是Third()
  • 显然我忘了包括我会将它用于 linq to 实体 ;( 根据blogs.msdn.com/b/meek/archive/2008/05/02/… 我必须使用表达式。目前我为过度简化问题而感到愚蠢。或者也许我错了,你可以在没有表情的情况下完成任务吗?
  • 如果你想让它成为一个实体查询,你确实需要表达式,这会改变答案的工作方式。
  • 我认为stackoverflow.com/questions/457316/… 涵盖了组合(也显示了特定的布尔大小写)。如果不是,请先搜索其他“[C#] 表达式组合”问题并评论为什么不同。

标签: c# linq expression iqueryable


【解决方案1】:

如果您需要表达式树,请在Square().BodyThird().Body 上使用Expression.Add 静态方法。

如果您只需要委托,请使用x =&gt; Square().Compile()(x) + Third().Compile()(x)

【讨论】:

  • 你还需要重写参数。
  • @SLaks 我同意,我的回答中缺少一些细节。他需要从头开始构建一个全新的表达式树,但Expression.Add 是基本成分。
  • SwapVisitor 的帮助下,我设法做到了。耶!非常感谢:)
猜你喜欢
  • 2020-08-02
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多