C# 使用LINQ或其他模块连接C中两个查询的结果
我有两个查询使用lambda从单个表中获取数据,我想使用类似SQL“join on”的方法,以便在单个id上连接表。这些查询是: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,
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实际上代表一封从发件人发送到收件人的电子邮件。