C# 使用LINQ或其他模块连接C中两个查询的结果

C# 使用LINQ或其他模块连接C中两个查询的结果,c#,sql-server,linq,asp.net-web-api,C#,Sql Server,Linq,Asp.net Web Api,我有两个查询使用lambda从单个表中获取数据,我想使用类似SQL“join on”的方法,以便在单个id上连接表。这些查询是: var tbl_emails_received = db.EmailAddresses .GroupBy(x => new { x.RecepientID }) .Select(x => new { x.Key.RecepientID,

我有两个查询使用lambda从单个表中获取数据,我想使用类似SQL“join on”的方法,以便在单个id上连接表。这些查询是:

    var tbl_emails_received =
        db.EmailAddresses
        .GroupBy(x => new { x.RecepientID })
        .Select(x => new
        {
            x.Key.RecepientID,
            EmailsRecieved = x.Count()

        });

我正在尝试复制此MsSQL查询正在执行的操作。我试图查看Microsoft的join文档,但它需要新的类来保存对象

WITH 
tbl_emails_received AS
    (
        SELECT RecepientID, count(FileID) AS EmailsRecieved 
        FROM tbl_ex_EmailAddresses
        GROUP BY RecepientID
    ),
tbl_emails_sent AS
    (
        SELECT SenderId, count(FileID) AS EmailsSent
        FROM tbl_ex_EmailAddresses
        GROUP BY SenderID
    )

SELECT s.SenderID as Id, r.EmailsRecieved, s.EmailsSent, 
    r.EmailsRecieved + s.EmailsSent as TotalEmails,
    slist.EmailAddress, slist.EmailName, slist.DomainName
FROM tbl_emails_received r
    JOIN tbl_emails_sent s
        ON r.RecepientID = s.SenderID

但也可能是LINQ或C无法像SQL处理数据那样动态创建对象。我的问题是,有没有一种方法可以复制SQL查询在LINQ或简单C中所做的工作?对于这类查询有什么最佳实践吗?我是否可以使用另一个包来简化此过程?

您可以使用两个初始查询来尝试类似的方法

var query = (from er in tbl_emails_received 
            join es in tbl_emails_sent on er.RecepientID equals es.SenderID
            select new emailsReceieved = er, emailsSent = es
            ).ToList();
EMailClass finalClass = query.select(
            x => new EMailClass
            {
            Id = x.emailsSent.SenderID,
            EmailsReceived = x.emailsReceieved.EmailsRecieved
            ...
            }).ToList();

这尚未经过测试或全面检查。到数据库的唯一步骤是创建查询。只有一个类与SQL SELECT语句的输出等效。它必须去某个地方。或者,您也可以将其设置为匿名类。

您可以使用两个初始查询来尝试类似的操作

var query = (from er in tbl_emails_received 
            join es in tbl_emails_sent on er.RecepientID equals es.SenderID
            select new emailsReceieved = er, emailsSent = es
            ).ToList();
EMailClass finalClass = query.select(
            x => new EMailClass
            {
            Id = x.emailsSent.SenderID,
            EmailsReceived = x.emailsReceieved.EmailsRecieved
            ...
            }).ToList();

这尚未经过测试或全面检查。到数据库的唯一步骤是创建查询。只有一个类与SQL SELECT语句的输出等效。它必须去某个地方。或者,您也可以将其设置为匿名类。

在db.EmailAddresses.ToList上运行select查询要从表中获取所有记录,请在该查询的顶部运行group by for recipientId和SenderId。这样一来,数据库命中率只有一次

在db.EmailAddresses.ToList上运行select查询以从表中获取所有记录,现在在该查询的顶部运行group by for recipientId和SenderId。这样,数据库命中率只有一次

这可能会有所帮助。由于这两个LINQ查询在此阶段不执行,并且使用匿名类型,因此将它们连接到一个返回所需结果的类型中。我想知道您的数据模型是否正确。我不明白电子邮件地址需要发件人和收件人id做什么。我觉得更好的数据模型会使您更容易获得所需的信息。如果你想在这方面有所改进,不妨考虑下一个新问题,也许是吧。数据模型有点误导人,但它已经使用了一段时间,因此如果不对数据库和.NET项目进行大规模更改,很难修复它。EmailAddressID实际上代表一封从发件人发送到收件人的电子邮件。这可能会有所帮助。由于这两个LINQ查询在此阶段不执行,并且使用匿名类型,因此将它们连接到一个返回所需结果的类型中。我想知道您的数据模型是否正确。我不明白电子邮件地址需要发件人和收件人id做什么。我觉得更好的数据模型会使您更容易获得所需的信息。如果你想在这方面有所改进,不妨考虑下一个新问题,也许是吧。数据模型有点误导人,但它已经使用了一段时间,因此如果不对数据库和.NET项目进行大规模更改,很难修复它。EmailAddressID实际上代表一封从发件人发送到收件人的电子邮件。