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

Posted

技术标签:

【中文标题】从实体框架查询返回的两个 List<> 对象的外连接【英文标题】:Outer Join on two List<> objects returned from entity framework query 【发布时间】:2019-12-01 04:04:44 【问题描述】:

我有两个要执行外部联接的列表 (List&lt;&gt;)。

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

如果revisionsByDateDateCreated 值没有匹配值,您可能会注意到最近的进度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<> 对象的外连接的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 查询结果返回至自定义实体

mybatis 查询数据库返回值某字段是 List 该怎么搞

试图模拟 IQueryable 实体框架查询

java List集合如何使用两个实体类中的参数方法?

实体框架第一次查询比第二次慢得多

实体框架:查询子实体 [重复]