2017-08-02 41 views
0

我试图创建一个简单的表达我有这样的简单类型:简单表达式组合

public class BSType 
{ 
    public int Length { get; set; } 
    public string Name { get; set; } 
} 

中,我试图动态创建过滤器表达式,这将是

(bsType) => bsType.Length == 3 

我创建了一个表达式,它返回给我的常量3

var right = Expression.Constant(3); 

然后我有另一个表达式,我的Func<BSType, int> S的看起来像这样

Expression<Func<BSType, int>> left = bsType => bsType.Length; 

当我尝试向他们提供平等的表达,像这样

Expression.Equal(left, right); 

比较我得到一个错误:

The binary operator Equal is not defined for the types 'System.Func`2[ExpressionBuilder.BSType,System.Int32]' and 'System.Int32'

我觉得我需要将类型的参数传递给函数的左侧,以便它可以解析长度,但我不确定如何这样做,任何人都可以指向正确的方向?

+0

我已经更新了我的问题,以显示大致发生了什么 –

+0

' Expression >''你不需要提取int的一部分,这样'left'是一个'int'而不是'Expression >'? –

+0

@TZZA耶我该怎么做?以某种方式生成可以与实体框架工作的表达式 –

回答

0

你试图表达的其中一个发生在一个FUNC作为参数,而不是与表达体结合,像这样结合:

Expression.Equal(left.Body, right) 
+1

'left'是OP代码中的'Expression >',而不是'Func <...>'。此外,你的代码实际上并不是按照它应该的方式组合表达式,它只是构造一个硬编码的表达式,而不用任何表达式,然后将它们组合起来。 – Servy

+0

我不是说'left'是'Func <>',它是一个表达式,每个表达式都有返回类型。在原来的问题返回类型'left'是'Func <>'。我的代码有什么问题?它构造了请求的表达式并且工作。 – Zergatul

+0

表达式不会“返回”任何内容。表达式是一些代码的表示。你可以说它代表的代码返回一个'int'。它当然不会返回一个'Func'。您的代码只是为给出的一个示例构造一个硬编码结果,而不是解决问题要求解决的问题。这就好像有人问你如何将两个数字加在一起,比如说2和5,并且你写了一个只返回7的方法,并说“它为你的例子返回正确的结果”。这是真的,但它并没有解决问题的实际问题。 – Servy