[英]Outer Join on two List<> objects returned from entity framework query
我有两个要执行外部联接的列表( List<>
)。
revisionsByDate
看起来像这样:
DateCreated RevisionCount
10-09-2019 15
11-09-2019 17
12-09-2019 5
13-09-2019 7
progresUpdates
看起来像这样:
DateCreated Progress
10-09-2019 60
13-09-2019 90
14-09-2019 100
我需要在这些List
对象上进行外部联接。 我尝试了以下代码,它可以正常工作,但可以进行inner
联接:
var resultsToReturn = revisionsByDate.Join(
progresUpdates,
revision => revision.DateCreated,
action => action.DateCreated,
(revision, action) => new {
revision.RevisionCount, action.Progress, action.DateCreated });
输出为:
DateCreated Progress RevisionCount
10-09-2019 60 15
13-09-2019 90 7
14-09-2019 100 0
但是,我要实现以下目标:
DateCreated Progress RevisionCount
10-09-2019 60 15
11-09-2019 60 17
12-09-2019 60 5
13-09-2019 100 7
14-09-2019 100 0
您可能会注意到,如果没有revisionsByDate
DateCreated
值匹配的值,则会重复最新的进度60
。
有什么想法可以将我的代码转换为outer
联接吗? 另外,我想知道是否应该在sql
执行此操作? 我正在使用Entity Framework Core。
你需要的是既有左右连接,一前一后。
尝试这个:
var resultsLeft = revisionsByDate.Select(r => new
{
Revision = r,
Action = progressUpdates.Where(pu => pu.DateCreated <= r.DateCreated)
.OrderByDescending(pu => pu.DateCreated)
.First()
})
.Select(_ => new
{
_.Revision.DateCreated,
_.Action.Progress,
_.Revision.RevisionCount
})
.ToList();
var resultsRight = progressUpdates.GroupJoin(revisionsByDate,
pu => pu.DateCreated,
r => r.DateCreated,
(pu, rr) => new
{
ProgressUpdate = pu,
NoMatch = !rr.Any()
})
.Where(pu => pu.NoMatch)
.Select(pu => new
{
pu.ProgressUpdate.DateCreated,
pu.ProgressUpdate.Progress,
RevisionCount = 0
})
.ToList();
var results = resultsLeft.Concat(resultsRight)
.OrderBy(r => r.DateCreated)
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.