C# Lambda Expression 翻译的很奇怪,有什么建议吗?

C# Lambda Expression translated strange, Any Suggestions?

我对以下 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);

Exception: Unrecognized NodeType (Convert),

我不明白为什么 lambda 表达式会给出 Covnert(1)Convert(0),有什么建议吗?


我尝试将 属性 EnableMarkDeleteMark 更改为 int 而不是 nullable<int>,然后成功了。但在其他情况下, nullable type 是必要的,有没有解决方案或文档? 谢谢。


@Eric Lippert 感谢您指出原因,我设置了一个值为'1'的变量,让它的类型为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);
}

I can't figure out why the lambda expression gives me Convert(1) and Convert(0)

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