我遇到以下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);
}
这是我的代码,我想在我的业务中添加默认表达式。
注意:属性EnableMark
和DeleteMark
为nullable<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)
,有什么建议吗?
我尝试将属性EnableMark
和DeleteMark
更改为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);
}
答案 0 :(得分:2)
我无法弄清楚为什么lambda表达式给出了Convert(1)和Convert(0)
如您所知,DeleteMark和EnableMark是可以为空的。 C#没有定义int和nullable int之间的比较运算符。它确实定义了两个可空的int之间的比较运算符,以及从int到nullable int的转换。 lambda转换捕获了整数1和0已被转换为可空整数以进行比较的事实。