4

我在使用动态表达式 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 进行比较。

4

6 回答 6

3

嗯,我终于明白了。cptScarlet 几乎拥有它。

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

或者

.Where("x[\"NullableIntColumnName\"] == @0", DBNull.Value);
于 2009-07-24T14:51:29.560 回答
1

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

.Where(string.format("x[\"NullableIntColumnName\"] == {0}",DBNull.Value));
于 2009-07-24T14:45:19.913 回答
1

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

于 2010-07-22T17:05:33.477 回答
1

一般来说,您也可以尝试:

.Where("NullableColumnName.HasValue");
于 2011-10-07T15:29:01.897 回答
0

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

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

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

于 2009-07-24T14:46:10.957 回答
0

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

编辑:

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

    var intColName = "...";
    .Where(string.Format("it.{0} is null", intColName));
于 2010-07-22T10:17:38.553 回答