查询我有一个相对简单的F#
查询表达式联接:leftOuterJoin和`.DefaultIfEmpty()`在F#
let mdrQuery =
query {
for header in db.CustomerDetails do
leftOuterJoin row in db.MDR_0916
on (header.PID = row.PID) into result
select (result, header)
}
这将返回每个header
和result
但对于一个header
,至今尚未row
匹配, result
只是一个空序列,当查询结果被传递给一个自定义类型时,我得到一个错误,说明与row
中的字段关联的构造函数未定义。这对于在row
中没有匹配的任何header
是有意义的,则返回null
序列。举个例子:
mdrQuery |> Seq.head;;
val it :
seq<dbSchema.ServiceTypes.MDR_0916> * dbSchema.ServiceTypes.CustomerDetails
= (seq [null], CustomerDetails {ACCOUNTMANAGER = null;
ACCOUNTSTATUS = "XC";
ADDRESSLINE1 = null;
ADDRESSLINE2 = null;
ADDRESSLINE3 = null;
ADDRESSLINE4 = "123 PIG ROAD"...
我怀疑有周围the leftOuterJoin
documentation here这一点,因为一种方式。但是,当我尝试使用这个例子作为我查询模板:
let mdrQuery =
query {
for header in db.CustomerDetails do
leftOuterJoin row in db.MDR_0916
on (header.PID = row.PID) into result
for row in result.DefaultIfEmpty() do
select (result, header)
}
的.DefaultIfEmpty()
件错误出与
error FS0039: The field, constructor or member 'DefaultIfEmpty' is not defined
有没有办法,我可以使这个连接发生和选择每行,填充result
中的不匹配行与None
(或其他一些空的SQL空值),以便可以将整个查询传递给我的记录类型?
在理想情况下,输出为不匹配的行会是这样的(由下面的手产生截短的结果)
mdrQuery |> Seq.head;;
val it :
seq<dbSchema.ServiceTypes.MDR_0916> * dbSchema.ServiceTypes.CustomerDetails
= (MDR_0916 {AIMExp = null;
AP = null;
APComp = null;
APEng = null;
APFine = null;
APForl = null;...},
CustomerDetails {ACCOUNTMANAGER = null;
ACCOUNTSTATUS = "XC";
ADDRESSLINE1 = null;
ADDRESSLINE2 = null;
ADDRESSLINE3 = null;
ADDRESSLINE4 = "123 PIG ROAD"...
编辑:This question/answer类似于矿,但包括ToOption result
简单地输出一个Some (seq [null])
。
在您的交互式输出中,'result'不是一个空序列,而是一个元素的序列,而那个元素是'null'。 –
感谢您的澄清。 – Steven
'DefaultIfEmpty'是一个扩展方法,所以你需要'打开System.Linq'。 – kvb