Linq - 在一个查询中计算多个平均值

2023-11-30

我正在尝试将一些 SQL 查询转换为 Linq 以避免多次访问数据库。

我试图转换的旧 SQL 是这样的:

SELECT
    AVG(CAST(DATEDIFF(ms, A.CreatedDate, B.CompletedDate) AS decimal(15,4))),
    AVG(CAST(DATEDIFF(ms, B.CreatedDate, B.CompletedDate) AS decimal(15,4)))
FROM
    dbo.A
INNER JOIN
    dbo.B ON B.ParentId = A.Id

所以我创建了两个 C# 类:

class B
{
    public Guid Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime CompletedDate { get; set; }
}

class A
{
    public Guid Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<B> BList { get; set; }
}

而且我有一个List<A>我要查询的对象。它是从数据库填充的,因此列表中的每个 A 都有一个包含 B 负载的子列表。我想使用 Linq-to-objects 来查询此列表。

因此,我需要使用 Linq 来获取 A 的开始和其子 B 的完成之间的平均时间,以及每个 B 的开始和完成之间的平均时间。我没有编写原始 SQL,所以我不完全确定它是否达到了预期的效果!

我有几个平均值需要计算,因此我想在一个神奇的 Linq 查询中完成所有这些操作。这可能吗?


更有趣的问题是如何在服务器上执行此类操作,例如将以下查询转换为 LINQ to SQL。

        var q = from single in Enumerable.Range(1, 1)
                let xs = sourceSequence
                select new
                {
                    Aggregate1 = xs.Sum(),
                    Aggregate2 = xs.Average(),
                    // etc
                };

但是,如果您使用 LINQ to Objects,则尝试将其塞入一个查询中是没有意义的。只需分别写出聚合即可:

var aggregate1 = xs.Sum();
var aggregate2 = xs.Average();
// etc

换句话说:

var xs = from a in listOfAs
         from b in a.Bs
         select new { A=a, B=b };

var average1 = xs.Average(x => (x.B.Completed - x.A.Created).TotalSeconds);
var average2 = xs.Average(x => (x.B.Completed - x.B.Created).TotalSeconds);

我理解对了吗?

编辑:David B 也做出了类似的回答。我忘记将 TimeSpan 转换为 Average 方法支持的简单数字类型。使用总毫秒/秒/分钟或任何合适的比例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linq - 在一个查询中计算多个平均值 的相关文章

随机推荐