4

Dynamic Expression 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") を使用することはできません。そうしないと、DBNull.Value の代わりに null と比較できます。

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

に変更x.Field<int>("Table1_ID")するとx.Field<int?>("Table1_ID")、通常の整数の代わりに null 許容整数が取得され、すべてのDBNull値が単純な C# null 値に変換されます。単にコード スニペットに基づいて、動的な式が必要かどうかさえわかりません。単純な式でうまくいく.Where(foo => foo.x == null)はずです。

于 2010-07-22T17:05:33.477 に答える
1

一般に、次を試すこともできます。

.Where("NullableColumnName.HasValue");
于 2011-10-07T15:29:01.897 に答える
1

現在の .Where を次のようなものに置き換えるとどうなりますか

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

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

編集:

申し訳ありませんが、この動的要件は見当たりませんでした... 動的は次のようになります: (少なくともフレームワーク 4 では)

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

USLで回答できなくて申し訳ありませんが...

ソースを見ましたか?たくさんありません。私の推測では、DBNull は登録されたルート オブジェクトのリストに含まれていません。

私は今手元にあるソースを持っていませんが、比較できる他の定数が何であるかを教えてくれる可能性があります.

于 2009-07-24T14:46:10.957 に答える