【发布时间】:2019-11-01 07:39:44
【问题描述】:
我有两个使用 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()
});
和
var tbl_emails_sent =
db.EmailAddresses
.GroupBy(x => new { x.SenderID })
.Select(x => new
{
x.Key.SenderID,
EmailsSent = x.Count()
});
我正在尝试复制此 MsSQL 查询正在执行的操作。我尝试查看 Microsoft 的 join (linked here) 文档,但它需要新的类来保存对象。
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# 中所做的事情?这种查询有什么最佳实践吗?是否有其他我可以使用的包可以使这更简单?
【问题讨论】:
-
由于这两个 LINQ 查询在此阶段未执行并且使用匿名类型,因此将它们加入到返回所需结果的类型中。
-
我想知道你的数据模型是否正确。我不明白
EmailAddress需要发件人和收件人 ID 做什么。我觉得一个更好的数据模型会让你更容易获得你需要的信息。如果您希望在这方面有所改进,请考虑在Code Review 上发布一个新问题,也许。 -
@GertArnold 我同意。 dataModel 有点误导,但它已经使用了一段时间,因此如果不对数据库和 .NET 项目进行大规模更改,就很难修复它。 EmailAddressID 实际上代表一封从 Sender 发送到 Receiver 的电子邮件。
标签: c# sql-server linq asp.net-web-api