繁体   English   中英

从实体框架查询返回的两个List <>对象的外部联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM