首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过EF Core中的特定列连接多个表中的数据集?

如何通过EF Core中的特定列连接多个表中的数据集?
EN

Stack Overflow用户
提问于 2018-04-26 00:29:56
回答 1查看 2.3K关注 0票数 2

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

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

来自MySQL/MSSQL背景,我会编写如下内容:

代码语言:javascript
复制
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到目前为止.

代码语言:javascript
复制
var allSurveys = _context.Audits
            .Include(f => f.FunSurvey)
                .ThenInclude(u => u.User)
            .Include(s => s.SadSurvey)
                .ThenInclude(u => u.User)
            .ToList();

...but我不知道如何将它映射回DTO,因为UserId/名称跨不同的调查对象,这取决于它所涉及的调查,而且它变得越来越混乱,这导致我认为这里的EF代码没有使用正确的方法。

我也不想得到所有的调查和审计专栏,因为这是一种浪费,返回的数据远远超过需要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 02:26:34

使用查询语法的等效LINQ查询与SQL查询(考虑到LINQ的具体内容)基本相同:

代码语言:javascript
复制
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查询实现相同的结果:

代码语言:javascript
复制
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();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50033116

复制
相关文章

相似问题

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