2017-05-30 44 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.