【问题标题】:LINQ Dynamic Expression API, predicate with DBNull.Value comparisonLINQ 动态表达式 API,与 DBNull.Value 比较的谓词
【发布时间】:2010-11-13 18:27:10
【问题描述】:

我在使用动态表达式 API 时遇到问题。我似乎无法将 DataTable 字段与 DBNull.Value 进行比较。该 API 应该能够“支持静态字段或静态属性访问。任何公共字段或属性都可以访问。”。但是给出以下查询:

 var whatever = table1.AsEnumerable()
                   .Join(table2.AsEnumerable(),
                   (x) => x.Field<int>("Table1_ID"),
                   (y) => y.Field<int>("Table2_ID"),
                   (x, y) => new { x, y})
                   .AsQueryable()
                   .Where("x[\"NullableIntColumnName\"] == DBNull.Value");

我最终得到错误:“类型'f__AnonymousType0`2'中不存在属性或字段'DBNull'”

有人对如何解决这个问题有想法吗?我不能在传递给 Where 方法的字符串中使用 Submission.Field("NullableIntColumnName"),顺便说一句,否则我将能够与 null 而不是 DBNull.Value 进行比较。

【问题讨论】:

    标签: linq dynamic datatable expression dynamic-linq


    【解决方案1】:

    好吧,我终于明白了。 cptScarlet 差点吃到了。

    var values = new object[] { DBNull.Value };    
    ...
    .Where("x[\"NullableIntColumnName\"] == @0", values);
    

    或

    .Where("x[\"NullableIntColumnName\"] == @0", DBNull.Value);
    

    【讨论】:

    • 该解决方案对我不起作用,因为我使用自定义的 Select 部件。如果在 Select 部分使用自定义对象(如 DTO),则列的类型也可以为空。
    【解决方案2】:

    当您将当前的 .Where 替换为类似的东西时会发生什么

    .Where(string.format("x[\"NullableIntColumnName\"] == {0}",DBNull.Value));
    

    【讨论】:

    • 极不可能工作 - {0} 被替换为 null,因为这是 DBNull.Value.ToString() 产生的结果
    • 澄清:Dynamic Linq 有自己的解析器,它将通过将其解析为字符串表达式来解释传递给 Where 的字符串
    • 感谢 cptScarlet ...我一看到您的回答,就想起了 Where 重载将字符串和参数 object[] 放在一起。
    【解决方案3】:

    如果您将x.Field&lt;int&gt;("Table1_ID") 更改为x.Field&lt;int?&gt;("Table1_ID"),那么您将获得可为空的整数而不是常规整数,并且任何DBNull 值都将转换为简单的C# 空值。仅基于您的代码 sn-p,我什至不确定您是否需要动态表达式 - 一个简单的 .Where(foo =&gt; foo.x == null) 应该可以工作。

    【讨论】:

    • 我确实需要动态表达式,但是关于使用 int 的要点?对于类型参数。
    【解决方案4】:

    一般来说,你也可以试试:

    .Where("NullableColumnName.HasValue");
    

    【讨论】:

      【解决方案5】:

      很抱歉没有用 USL 回答,但是...

      您查看过源代码吗?没有很多。我的猜测是 DBNull 不在已注册的根对象列表中。

      我现在手头没有来源,但它也可能会告诉您可以与之比较的任何其他常量。

      【讨论】:

        【解决方案6】:

        .Where(a => a.IntColName == null);

        编辑:

        抱歉,我没有看到这个动态要求...动态应该是:(至少在框架 4 中)

            var intColName = "...";
            .Where(string.Format("it.{0} is null", intColName));
        

        【讨论】:

        • 不,我做不到,列选择是动态的,基于用户输入。
        猜你喜欢
        • 1970-01-01
        • 2021-09-16
        • 2016-10-10
        • 2013-06-09
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        相关资源
        最近更新 更多