Expression.Call, Int32 and Enum
本文关键字:and Enum Int32 Call Expression | 更新日期: 2024-11-07 15:25:05
无法弄清楚如何构建将枚举类型与整数进行比较的表达式。我有一个嵌入了剑道组件的 MVC 站点。在视图类中,属性是 ENUM,但视图返回 Int32(源是 Kendo IFilterDescriptor)。
所以问题是...:我从视图中收到一个int,构建表达式,但由于需要枚举而失败。通过将 int 转换为其枚举表示形式来解决此问题,但在查询数据库时会失败,因为数据库需要 Int32。
public static Expression<Func<DOMAIN, bool>> GetExpressionsFromFilterDescription<DOMAIN, VIEW>(this IEnumerable<IFilterDescriptor> _this)
{
Expression expressions = null;
ParameterExpression pe = Expression.Parameter(typeof(DOMAIN), "x");
foreach (FilterDescriptor item in _this)
{
MemberExpression member = Expression.Property(pe, item.Member);
ConstantExpression value = Expression.Constant(item.Value);
Expression exp = null;
switch (item.Operator)
{
case FilterOperator.IsEqualTo:
exp = Expression.Equal(member, value);
据我了解,Expression.Call() 应该能够解决这个问题,我只是不知道该怎么做。
任何帮助将不胜感激。
彼得·
更新
像下面这样转换值确实解决了表达式问题("没有为类型定义二进制运算符 Equal..."error),但随后我在查询数据库时收到一个新错误:"NHibernate.Criterion.SimpleExpression 中的类型不匹配:状态预期类型 System.Int32,实际类型..."。
exp = Expression.Equal(member, Expression.Convert(value, typeof(MyEnum)));
在我看来,修复是通过构建我自己的比较(Expression.Call ?)或通过告诉类型(在项目中。成员)是一个整数而不是枚举,但我不知道如何或这是否是正确的方式。谢谢。
更新更新
问题的第二部分似乎是由于NHibernate.QueryOver及其局限性造成的。一旦更改为NHibernate.Linq,问题的查询部分就消失了。
至于表达式部分,我已经通过在属性中添加一个属性来解决问题,该属性告诉应该如何转换值。我没有使用 Expression.Convert(但我可以),转换发生在构建表达式之前收到的过滤器描述中。
感谢您的时间和帮助。我将接受与Expression.Convert相关的答案,因为它可以解决问题。我仍然想了解 Expression.Call() 方法 - 所以请随时对此发表评论。谢谢。
这难道不行吗?
MemberExpression member = Expression.Convert(
Expression.Property(pe, item.Member), typeof(int);
ConstantExpression value = Expression.Constant((int)item.Value);
Expression.Convert
将枚举的表达式转换为 int type to an
"(假设枚举的基础类型是 int)。
我没有完全看到您正在比较的枚举,是项目吗?价值?
您始终可以将枚举的值转换为数字,以将其与数字进行比较,或将其馈送到无法识别枚举的系统中:
enum Blah
{
Tom,
Rick,
Harry
}
if ((Int32)Blah.Tom == 0)
{
}