gpt4 book ai didi

f# - F# 中的 leftOuterJoin 和 `.DefaultIfEmpty()` 查询

转载 作者:行者123 更新时间:2023-12-04 21:35:14 24 4
gpt4 key购买 nike

我有一个比较简单的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)
}

这将返回每个 headerresult但是对于 header row 中不匹配的, result只是一个空序列,当查询结果传递给自定义类型时,我收到一个错误,即构造函数与 row 中的字段相关联没有定义。这对于任何 header 都是有意义的。 row 中没有匹配项, 一个 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]) .

最佳答案

文件有误;在 C# 中,没有 leftOuterJoin 的直接等价物。运算符,所以 DefaultIfEmpty与普通连接一起使用,但在 F# 中您不需要它(查询生成器会为您执行此转换 - 如果您好奇,请参阅 source 中的 QueryBuilder.LeftOuterJoin)。

如果您想要传统左连接的结果,则只需添加额外的 for没有 DefaultIfEmpty 的循环(但请注意 - 您要选择新绑定(bind)的 row 值,而不是 result 序列):

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 do
select (row, header)
}

请注意,这将为您提供 null MDR_0916 的值缺少的条目,不是特殊的 MDR_0916 null 的值但是,如果需要后处理步骤,则可能需要应用后处理步骤。

关于f# - F# 中的 leftOuterJoin 和 `.DefaultIfEmpty()` 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com