如果你声明它,可以创建一个表达式树。
但是有可能为普通的代码块(例如方法或属性getter)获取表达式树吗?
我想要做的是,假设订单处理系统,我有一个订单项类:
class Item : Entity
{
[Cascade]
public Document document { get; set; }
public int line { get; set; }
public Product product { get; set; }
public string description { get; set; }
public decimal qty { get; set; }
public decimal price { get; set; }
public decimal net
{
get
{
return qty * price;
}
}
public VatCode vat_code { get; set; }
}
其中净值等于qty * price,所以我想声明它,无论是使用属性还是方法,然后还让框架内省该表达式,以便它可以生成适当的SQL来定义相应的计算结果相应数据库视图中的列。
最明显的方法是获取属性getter或方法的表达式树,但我找不到任何指示如何执行此操作,或者它是可能的。 (我已经找到了一种将方法体作为字节流的方法,但这不是这里所希望的。)
如果那是不可能的,我认为建议的解决方案是声明类似于表达式树的静态字段,并在运行时编译/运行它以供内部使用,并且也像SQL生成一样内省?
答案 0 :(得分:1)
不,不可能 - 普通代码是字节码,没有机制将其转换为表达式树。你可以做的就是使用反射 - 但基本上就是它。
答案 1 :(得分:1)
我之前一直在寻找类似的东西,而且我还没有找到一个完美的方法来做到这一点,tbh。
你可能遇到的另一个问题是,即使你有一个你想要在linq查询中注入的表达式树 - 它不是直截了当的,而且听起来很简单......
对于它的价值,一种方法是存储一个静态表达式,允许你的“网”出来,并让“net”属性的getter对this
运行这个表达式。 / p>
如何在常规linq查询中注入表达式? 我写了一篇关于它的blog post。基本上,我创建了一个表达式扩展器,它将使用自定义表达式更新L2S表达式树:) Extending LINQ selectors with custom expressions