从实体框架查询返回的两个 List<> 对象的外连接
Posted
技术标签:
【中文标题】从实体框架查询返回的两个 List<> 对象的外连接【英文标题】:Outer Join on two List<> objects returned from entity framework query 【发布时间】:2019-12-01 04:04:44 【问题描述】:我有两个要执行外部联接的列表 (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。
【问题讨论】:
LINQ to SQL multiple tables left outer join的可能重复 【参考方案1】:你需要的是both左右连接,一个接一个。
试试这个:
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();
【讨论】:
以上是关于从实体框架查询返回的两个 List<> 对象的外连接的主要内容,如果未能解决你的问题,请参考以下文章