【问题标题】:Joining results from two queries in C# using LINQ or other module使用 LINQ 或其他模块在 C# 中连接两个查询的结果
【发布时间】: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


【解决方案1】:

您可以尝试这样的事情(使用您的两个初始查询)

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();

这尚未经过测试或完全检查。唯一的数据库之旅是创建query。只有一个类相当于 SQL SELECT 语句的输出。 (它必须去某个地方)。或者,您也可以将其设为匿名类。

【讨论】:

    【解决方案2】:

    在 db.EmailAddresses .ToList() 上运行选择查询以从表中获取所有记录,现在在此查询的顶部运行 group by for recipientId 和 SenderId。这种方式数据库命中只有一次

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2013-03-26
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多