繁体   English   中英

C# 表达式树和 null

[英]C# Expression Trees and is null

我正在尝试创建一个表达式树来制作一个可以在 EntityFramework Where 子句中使用的 lambda。 我需要检查 null 并尝试使用is null 所以像这样:

    var param = Expression.Parameter(typeof(Customer), "data");
    var fieldExpression = Expression.Property(param, "Address");
    var nullTest = Expression.IsNull(fieldExpression);
    var lambda = Expression.Lambda(nullTest, param);
    var compiled = lambda.Compile() as Func<Customer, bool>;

    using dbContext = new TestDbContext();
    var customersWithNullAddress = dbContext.Customers.Where(compiled);

这里假设dbContext有一个DbSet<Customer>并且Customer有一个名为Address的属性。 目标是拥有这个:

    var customersWithNullAddress = dbContext.Customers.Where(c => c.Address is null);

但我需要动态生成谓词,因为它来自允许用户动态创建过滤条件的用户界面。

当然这不起作用,因为Expression.IsNull不存在。 我似乎无法在表达式树中找到某种机制来执行此操作。 我想我能做到

    Expression.Equal(fieldExpression, Expression.Constant(null, typeof(Address))

但这似乎不再是测试 null 的推荐方法,我想确保它转换为正确的 SQL 为SELECT * FROM Customer WHERE Address is null

任何人都能够在表达式树中进行这种模式匹配吗?

C# 中的is null操作是在创建 LINQ 表达式树很久之后添加的语法糖。 在常规代码中,它编译为与== null相同的 IL 代码(至少在大多数情况下),因此此时没有太多动机将语法添加到表达式树中。

至于它如何转换为 SQL, == null自 LinqToSQL 过去的美好时光以来一直在 SQL 中转换为IS NULL 可能仍然有一些方法可以使一些 SQL 转换为= NULL - 这当然总是错误的 - 但你必须真正尝试调用其中之一。

因此,如果您只是想确保文字something == null将始终转换为 SQL 中的something IS NULL for EF(或 LinqToSQL,或 NHibernate,或 Linq2DB,或...),您已经知道了。 如果代码不那样工作,太多的代码会严重崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM