首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Entity Framework中使用LINQ对两个匿名类型列表进行外部联接

在Entity Framework中使用LINQ对两个匿名类型列表进行外部联接
EN

Stack Overflow用户
提问于 2019-11-13 03:24:25
回答 1查看 42关注 0票数 0

我有以下两个列表:

代码语言:javascript
复制
var feedbackTaskHistory = _context.FeedbackTasks
   .Select(ft => new { ft.Id, ft.DateCreated })
   .GroupBy(ai => ai.DateCreated.ToString(@"yyyy-MM-dd"))
   .Select(g => new
   {
       Id = g.Key,
       a= g.Where(ad => ad.DateCreated <= Convert.ToDateTime(g.Key)).Count(),
   })
   .ToList();
//[{Id=2019-11-09, a=3}, {Id=2019-11-10, a=3}, {2019-11-11, a=5}]


var discussionPostHistory = _context.RubricItemScoreComments
   .Select(ft => new { ft.Id, ft.RubricItemId, ft.DateCreated })
   .GroupBy(ai => ai.DateCreated.ToString(@"yyyy-MM-dd"))
   .Select(g => new
   {
       Id = g.Key,
       b= g.Where(ad => ad.DateCreated <= Convert.ToDateTime(g.Key)).Count(),
   })
   .ToList();
//[{Id=2019-11-10, b=1}, {2019-11-11, b=2}, {2019-11-12, b=1}]

我想使用外部连接合并这两个列表,以获得以下列表:

代码语言:javascript
复制
  [
      {Id=2019-11-09, a=3, b=0},
      {Id=2019-11-10, a=3, b=1},
      {Id=2019-11-11, a=5, b=2},
      {Id=2019-11-12, a=0, b=1},
  ]

我计划使用iterate遍历列表,但这听起来效率不高。我可能在两个列表中都有大约100个项目。我想知道是否有一种性能高效的方法来完成这项任务。有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-13 05:18:37

使用我的Full Outer Join扩展方法,您可以这样做:

代码语言:javascript
复制
var ans = feedbackTaskHistory.FullOuterJoin(discussionPostHistory,
                                            f => f.Id,
                                            d => d.Id,
                                            (key, left, right) => new { Id = key, a = left?.a ?? 0, b = right?.b ?? 0});

效率方面,可枚举版本将常规LINQ左外连接与基于HashSet的自定义右反半连接相结合,以生成正确的答案。这确实意味着左和右可枚举项被处理两次。

在这种情况下,您也可以使用我的OrderableFullOuterJoin (为已删除的问题编写),它只枚举每一方一次,但要复杂得多。如果你知道项目是排序的,OrderedFullOuterJoin会更快。无论哪种情况,对于100个项目,我都怀疑是否存在显著的性能差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58825380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档