C#Lambda表达式翻译奇怪,有什么建议吗?

时间:2017-10-28 15:07:05

标签: c# lambda dapper

我遇到以下lambda表达式的问题:

public IEnumerable<ModuleEntity> GetPageList(Pagination pagi, string query)
{
    var expression = LinqExpression.Default<ModuleEntity>();
    expression = expression.And(e =>
       e.DeleteMark != 1 &&
       e.EnableMark != 0
    );

   return this.BaseRepository().GetList(expression, pagi);
}

这是我的代码,我想在我的业务中添加默认表达式。 注意:属性EnableMarkDeleteMarknullable<int>。 当我调试时,lambda表达式将表达式转换为:

{p => ((1 == 1) AndAlso ((p.DeleteMark != Convert(1)) AndAlso (p.EnableMark != Convert(0))))};

这会导致我的查询抛出异常:

// use Dapper connection Query
var query = dbConnection.Query<T>(linq);
  

异常:无法识别的NodeType(转换),

我无法弄清楚为什么lambda表达式会给我Covnert(1)Convert(0),有什么建议吗?

我尝试将属性EnableMarkDeleteMark更改为int而不是nullable<int>,然后才有效。但在其他情况下,nullable type是必要的,是否有任何解决方案或文件? 感谢。

@Eric Lippert感谢您指出原因,我设置了一个值变量&#39; 1&#39;,让它的类型为int?,并分配给DeleteMark。它工作!!

public IEnumerable<ModuleEntity> GetPageList(Pagination pagi, string query)
{
    var expression = LinqExpression.Default<ModuleEntity>();
    int? deleteMark = 1;
    int? enableMark = 0
    expression = expression.And(e =>
       e.DeleteMark != deleteMark &&
       e.EnableMark != enableMark
    );

   return this.BaseRepository().GetList(expression, pagi);
}

1 个答案:

答案 0 :(得分:2)

  

我无法弄清楚为什么lambda表达式给出了Convert(1)和Convert(0)

如您所知,DeleteMark和EnableMark是可以为空的。 C#没有定义int和nullable int之间的比较运算符。它确实定义了两个可空的int之间的比较运算符,以及从int到nullable int的转换。 lambda转换捕获了整数1和0已被转换为可空整数以进行比较的事实。