C# Expression.Call、Int32和Enum
无法理解如何构建一个比较枚举类型和int的表达式。我有一个嵌入了剑道组件的MVC站点。在view类中,属性是枚举,但视图返回Int32(源是Kendo IFilterDescriptor) 所以问题是…:我从视图中收到一个int,构建表达式,但由于需要一个enum,所以失败了。通过将int转换为其enum表示来修复此问题,但在查询数据库时失败,因为数据库需要Int32C# Expression.Call、Int32和Enum,c#,fluent-nhibernate,expression,kendo-grid,C#,Fluent Nhibernate,Expression,Kendo Grid,无法理解如何构建一个比较枚举类型和int的表达式。我有一个嵌入了剑道组件的MVC站点。在view类中,属性是枚举,但视图返回Int32(源是Kendo IFilterDescriptor) 所以问题是…:我从视图中收到一个int,构建表达式,但由于需要一个enum,所以失败了。通过将int转换为其enum表示来修复此问题,但在查询数据库时失败,因为数据库需要Int32 public static Expression<Func<DOMAIN, bool>> Get
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?),要么是告诉类型(在item.Member中)是int而不是enum,但我不知道这是如何或是否正确。
谢谢
更新更新
问题的第二部分似乎是由于NHibernate.QueryOver及其局限性造成的。一旦改为NHibernate.Linq,问题的查询部分就消失了
至于表达式部分,我已经通过向属性添加一个属性来修复了这个问题,该属性告诉应该如何转换值。我没有使用Expression.Convert(但我可以),转换在生成表达式之前在收到的筛选器描述中进行
谢谢你的时间和帮助。我将接受与Expression.Convert相关的答案,因为它可以解决问题。我仍然想理解Expression.Call()方法,所以请随意评论。谢谢。我没有看到您要比较的枚举,是item.Value吗 始终可以将枚举的值强制转换为数字,以将其与数字进行比较,或将其馈送到不识别枚举的系统中:
enum Blah
{
Tom,
Rick,
Harry
}
if ((Int32)Blah.Tom == 0)
{
}
我看不到您要比较的枚举,是item.Value吗 始终可以将枚举的值强制转换为数字,以将其与数字进行比较,或将其馈送到不识别枚举的系统中:
enum Blah
{
Tom,
Rick,
Harry
}
if ((Int32)Blah.Tom == 0)
{
}
可以使用
Expression.Convert
将枚举类型的表达式转换为int`(假设枚举的基础类型是int)。可以使用Expression.Convert
将枚举类型的表达式转换为int`(假设枚举的基础类型是int).这难道不起作用吗
MemberExpression member = Expression.Convert(
Expression.Property(pe, item.Member), typeof(int);
ConstantExpression value = Expression.Constant((int)item.Value);
这难道不管用吗
MemberExpression member = Expression.Convert(
Expression.Property(pe, item.Member), typeof(int);
ConstantExpression value = Expression.Constant((int)item.Value);
item.Member包含属性的名称并通过它查找其类型。item.Member包含属性的名称并通过它查找其类型。我看到了表达式。Call I有点像IEqualityComparer-它使我能够(以某种方式)进行自己的比较-错了吗?我看到了这个表达。我有点像IEqualityComparer-它让我能够(不知何故)进行自己的比较-错了吗?