2009-07-24 51 views
3

我有使用動態表達式API的問題。我似乎無法將DataTable字段與DBNull.Value進行比較。 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’」

任何人對如何獲得靈感在這附近?我不能在傳遞給Where方法的字符串中使用Submission.Field(「NullableIntColumnName」),或者我可以比較null而不是DBNull.Value。

回答

3

嗯,我終於明白了。 cptScarlet幾乎擁有它。

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

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

該解決方案對我無效,因爲我使用自定義選擇部件。如果在Select部分中使用像DTO這樣的自定義對象,則列的類型也將爲空。 – ahmet 2016-08-08 12:27:52

1

當你喜歡的東西

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

極不可能工作 - {0}空被替換,因爲這是啥子DBNull.Value.ToString()產生 – 2009-07-24 14:47:31

+0

澄清:動態的LINQ都有自己的解析器將通過將字符串解析爲字符串表達式解釋字符串 – 2009-07-24 14:48:41

+0

感謝cptScarlet ...只要我看到您的答案,我就會記住Where重載將字符串和params對象[]結合在一起。 – 2009-07-24 14:54:14

0

對不起,不回答了USL,但...

你有沒有在源看了替換當前的。哪裏會發生什麼?沒有太多。我的猜測是,DBNull不在註冊的根對象列表中。

我現在沒有提供源代碼,但它也可能告訴你可能與其他任何常量進行比較。

0

。凡(A => a.IntColName == NULL);

編輯:

對不起,我我以前不看這個充滿活力的要求...動態是:(至少在Framework 4)

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

不,我不能這樣做,列選擇是動態的,基於用戶輸入。 – 2010-07-22 20:10:41

1

如果更改x.Field<int>("Table1_ID")x.Field<int?>("Table1_ID")那麼你」會得到可空的整數而不是常規的整數,並且任何DBNull值都將被轉換爲簡單的C#空值。根據你的代碼片段,我甚至不知道你需要動態表達式 - 一個簡單的.Where(foo => foo.x == null)應該工作。

+0

我絕對需要動態表達式,但指出使用int?爲類型參數。 – 2010-07-22 20:10:07

1

一般情況下,你也可以嘗試:

.Where("NullableColumnName.HasValue");