2009-07-24 19 views
3

動的式APIを使用する際に問題があります。私はDBNull.Valueに対してDataTableフィールドを比較することはできません。 APIは、 "静的フィールドまたは静的プロパティへのアクセスをサポートすることができるようになっています。すべてのパブリックフィールドまたはプロパティにアクセスできます。"LINQ動的式API、DBNull.Valueの比較を伴う述語

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"); 

私はエラーになってしまう:しかし次のクエリ与えられた「いいえプロパティまたはフィールド 『のはDBNull』 『<> f__AnonymousType0`2』タイプに存在する」

誰でも取得する方法についてのアイデアを持っていますこの周り?私は、Subtype.Field( "NullableIntColumnName")をWhereメソッド、btwに渡された文字列で使うことはできません。さもなければ、DBNull.Valueの代わりにnullと比較することができます。あなたは

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

答えて

3

さて、私はついにそれを手に入れました。 cptScarletはほとんどそれを持っていた。

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

又は

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

私はカスタマイズされた選択部分を使用しているので、その解決策は私のためには機能しません。選択部分でDTOのよ​​うなカスタマイズされたオブジェクトを使用すると、列の型もNULL可能になります。 – ahmet

1

それほど多くはありません。私の推測では、DBNullは登録されたルートオブジェクトのリストにないということです。

私は今すぐ手元にいるわけではありませんが、他の定数と比較してもいいかもしれません。

+0

作業することは非常に可能性は低い - {0}はnullに置き換えられます、それはDBNull.Value.ToStringは() –

+0

明確化をもたらしWAHTだとして:動的LINQのは、独自のを持っていますパーサーは、文字列の式としてそれを解析することによってどこにpasswed文字列を解釈するでしょう –

+0

ありがとうcptScarlet ...あなたの答えを見てすぐに私は一緒に文字列とparamsオブジェクト[]を取るオーバーロードを覚えました。 –

0

USLと非答えに申し訳ありませんが...

は、あなたがソースで見たことがありますか?のようなものを使用して、現在の.Whereを置き換えるとどう

0

.Where(=> a.IntColName == NULL);その後、(少なくともFramework 4の中で)

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

いいえ、これはできませんでした。列の選択は、ユーザーの入力に基づいて動的です。 –

1

あなたはx.Field<int?>("Table1_ID")x.Field<int>("Table1_ID")を変更する場合は、」:

編集:

申し訳ありませんが、私はこのダイナミックな要件を参照してくださいdid't ...動的だろうに通常の整数ではなくヌル可能な整数を取得し、DBNullの値はすべて単純なC#のヌル値に変換されます。あなたのコードスニペットだけに基づいて、私はあなたが動的な表現を必要としているかどうかも分かりません - 単純な.Where(foo => foo.x == null)はうまくいくはずです。一般的に

+0

私は動的表現を間違いなく必要としましたが、型パラメータの場合 –

1

、あなたも試すことができます。

.Where("NullableColumnName.HasValue");