2017-05-30 68 views
1

我有一個查詢,我想在某些列有NULL所有記錄:F#sqlProvider的 - NULL在WHERE子句

query { 
    for a in db.Dbo.DataAlert do 
    where (a.DateSent = null) 
    select a 
} 

但是,這將引發一個錯誤,指出null不是一個有效的值。

寫這個查詢的正確方法是什麼?

更新:我正在使用this SQLProvider

+1

似乎SQLProvider不會爲可空列列表生成可爲空的屬性。您可能應該使用帶有EF或其他ORM的LINQ。附註:我不能相信......涉及到......它是使用F#進行ETL。嘗試向SqlBulkCopy發送一個類型提供者列,例如 –

+0

您使用的是哪個SQLProvider btw,而不是'isNull'做你想做的事情? – s952163

+1

@ s952163我已添加鏈接。 – Anil

回答

3

通過指定UseOptionTypes靜態參數,可以生成可爲空列的選項類型。默認值是false,它返回例如0而不是NULL。這在文檔中沒有很好的記錄,例如在Querying文檔頁面中沒有提及,並且在Home頁面中只有一個示例。

一旦您設置UseOptionTypes到true

type sql = SqlDataProvider< 
       ConnectionString = connectionString, 
       DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER, 
       UseOptionTypes = true 
       > 

可空字段將返回選項類型,讓你寫:

query { 
    for a in db.Dbo.DataAlert do 
    where (a.DateSent = None) 
    select a 
} 
+0

是的,的確!我想他想要'a.DateSent = None'。 :-) – s952163

+0

哎唷!你是對的 –

1

最徹底的方法是指定useOptTypes = true如其他回答。但是,這可能涉及到重構其他代碼。如果因爲任何原因無法執行此操作,則需要檢查null的defaultValue。因此,例如,如果該列的類型是string,那麼「」,或者如果它是和int然後是0.