c# - 如何在 EF Core 中连接多个表中仅包含某些列的数据集?

标签 c# entity-framework linq entity-framework-core ef-core-2.0

所以我有悲伤的调查和有趣的调查,它们都记录在自己的表格中。每个都附有审核数据。因此,调查在审计表中的记录中包含一个外键。

我正在构建一个网页来列出所有已提交的调查。调查 ID、用户名和提交日期。

来自 MySQL/MSSQL 背景,我会写这样的东西:

SELECT s.Id, u.Name, a.SubmittedOn
FROM sadSurveys s
LEFT JOIN audits a ON s.AuditId = a.Id
LEFT JOIN users u ON s.UserId = u.Id
UNION
SELECT f.Id, u.Name, a.SubmittedOn
FROM funSurveys f
LEFT JOIN audits a ON f.AuditId = a.Id
LEFT JOIN users u ON f.UserId = t.Id

但是,到目前为止,使用 EF 我已经做到了...

var allSurveys = _context.Audits
            .Include(f => f.FunSurvey)
                .ThenInclude(u => u.User)
            .Include(s => s.SadSurvey)
                .ThenInclude(u => u.User)
            .ToList();

...但我不知道如何将其映射回 DTO,因为 UserId/Name 跨不同的调查对象,具体取决于它所涉及的调查,并且它变得困惑,这导致我在这里思考我的 EF 代码没有使用正确的方法。

我也不想在调查和审计中获取所有列,因为这是一种浪费,返回的数据远多于所需的数据。

最佳答案

使用查询语法的等效 LINQ 查询与 SQL 查询几乎相同(考虑到 LINQ 细节):

var allSurveys = (
    from s in _context.SadSurveys
    join a in _context.Audits on s.AuditId equals a.Id
    into s_a from a in s_a.DefaultIfEmpty() // left join
    join u in _context.Users on s.UserId == u.Id
    into s_u from u in s_u.DefaultIfEmpty() // left join
    select new SurveyDTO { Id = s.Id, Name = u.Name, SubmittedOn = a.SubmittedOn }
    ).Concat(
    from s in _context.FunSurveys
    join a in _context.Audits on s.AuditId equals a.Id
    into s_a from a in s_a.DefaultIfEmpty() // left join
    join u in _context.Users on s.UserId == u.Id
    into s_u from u in s_u.DefaultIfEmpty() // left join
    select new SurveyDTO { Id = s.Id, Name = u.Name, SubmittedOn = a.SubmittedOn }
    ).ToList();

但是,ORM 和导航属性允许您使用更简单的 LINQ 查询获得相同的结果:

var allSurveys = ( 
    from s in _context.SadSurveys
    select new SurveyDTO { Id = s.Id, Name = s.User.Name, SubmittedOn = s.Audit.SubmittedOn }
    ).Concat(
    from s in _context.FunSurveys
    select new SurveyDTO { Id = s.Id, Name = s.User.Name, SubmittedOn = s.Audit.SubmittedOn })
    ).ToList();

关于c# - 如何在 EF Core 中连接多个表中仅包含某些列的数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033116/

相关文章:

c# - 按字段对列表进行分组并将项目添加到字典

c# - 避免循环生成可为空的集合,提高性能

c# - 导出div内容为pdf格式

c# - Entity Framework - 以多列索引作为标识符的种子 AddOrUpdate

c# - 在 LINQ-to-Entities 查询中使用 .Include() 时返回最大/限制?

c# - 在不同模式中映射具有相同表的实体Entity Framework 6代码优先

c# - 自定义 DbContext 生成器

c# - 将 List<SomeObject> 拆分为多个子列表

c# - ViewModel概念仍然存在于ASP.NET MVC Core中吗?

c# - skydrive System.Dynamic.DynamicObject