gpt4 book ai didi

c# - Linq - 在可能没有记录的表上使用左连接

转载 作者:行者123 更新时间:2023-11-30 21:41:04 25 4
gpt4 key购买 nike

假设我有 3 个表 - 1 个标题和 2 个详细信息:

标题表

id | label
1 | foo
2 | bar

详细信息 1 表

id | date       | value
1 | 2015-01-01 | 5

详细信息 2 表

id | date       | value
1 | 2015-01-01 | 7
2 | 2016-02-02 | 10

我想创建一个连接所有三个的 linq 查询,但不会消除数据,因为一个详细表没有记录,而另一个有记录。结果应如下所示:

结果表

id | label | date       | value1 | value2
1 | foo | 2015-01-01 | 5 | 7
2 | bar | 2016-02-02 | <null> | 10

因此,value1 为 null,而不是删除整行。

如果我在写 SQL,我可以写

select
h.id,
h.label,
coalesce(d1.date, d2.date) as date,
d1.value as value1,
d2.value as value2
from
header h
left join detail1 d1
on d1.id = h.id
left join detail2 d2
on d2.id = h.id
and (
d2.date = d1.date
or d1.date is null
)

是否可以使用 Linq 编写此代码?我正在使用“on new equals new”语法,但在没有匹配的 detail1 记录时,我不知道如何保留 detail2 记录。

编辑:我觉得链接的答案只回答了我问题的左连接部分。我知道我可以在 linq 中加入,但 detail2 表正在加入标题(不是问题)和 detail1。如果 detail1 在 detail2 中没有日期记录,则 detail2 记录将不会出现在结果中。使用“select new{} equals new{}”不允许我在 equals 之前使用 detail2 对象,所以我不能写

from
h in header.AsEnumerable()
join d1.AsEnumerable().DefaultIfEmpty()
on p.Id equals d1.Id
join d2.AsEnumerable().DefaultIfEmpty()
on new {
Id = h["Id"],
Date = d1["Date"] ?? d2["Date"], // Doesn't work, can't use d2 here.
} // d1 may not have a record, so there may not be a match
equals new {
Id = d2["Id"],
Date = d2["Date"],
}
select new {
// etc...
}

最佳答案

要实现具有任意条件的连接,您需要使用另一个带有 wherefrom 子句来处理您的条件。我不确定如果与 Linq to SQL 一起使用会生成什么类型​​的 SQL,您最好使用我的 FullOuterJoin/LeftOuterJoin IQueryable 扩展。

var ans = from h in header
join d1 in detail1 on h.id equals d1.id into hd1j
from hd1 in hd1j.DefaultIfEmpty()
from d2 in detail2 where h.id == d2.id && (hd1?.date == null || hd1.date == d2?.date)
select new { h.id, h.label, date = hd1?.date ?? d2?.date, value1 = hd1?.value, value2 = d2?.value };

对于我的Enumerable 测试,我放入了条件运算符。如果针对 IQueryable(例如 Linq to SQL)进行测试,您应该删除它们。

关于c# - Linq - 在可能没有记录的表上使用左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43880074/

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