gpt4 book ai didi

c# - 使用可为空的日期时间获取计算项的平均值

转载 作者:太空宇宙 更新时间:2023-11-03 11:44:14 26 4
gpt4 key购买 nike

糟糕的标题,我知道......

这行得通并且给了我我正在寻找的东西,但我知道必须有更好的方法来做到这一点:

var query = (from a in DB
where a.Date.HasValue
select a).AsEnumerable();

double avg = (from a in query
select (a.Date.Value.Subtract(a.OtherDate).Days).Average();

基本上,a.Date 是一个可为 null 的日期时间,我只想在 a.Date 存在时获取 (a.Date - a.OtherDate) 的平均值(否则计算将不起作用)。

这样的事情是行不通的:

double avg = (from a in DB
where a.Date.HasValue
select a.Date.Value.Subtract(a.OtherDate).Days).Average();

我知道我见过类似的问题,解决方案是将可为空的字段显式设置为可为空的日期时间,从而使 Average 方法起作用。我还没有看到可空字段是像这样的计算的一部分。

提前致谢。

编辑:为了更清楚地说明问题,让我向您提供 Ben 的解决方案及其生成的错误消息。我不得不承认我遗漏了另一部分......a.OtherDate 实际上有点棘手......让我举例说明:

var avg = DB.Where(a => a.Date.HasValue)
.Where(a => a.ForeignKeyReference.Date.HasValue)
.Select(a => a.Date.Value.Subtract(a.ForeignKeyReference.Date.Value).Days)
.Average();

...和错误:

InvalidOperationException:无法翻译表达式 'Table(DB).Where(a => a.Date.HasValue).Where(a => a.ForeignKeyReference.Date.HasValue).Select(a => a.Date. Value.Subtract(a.ForeignKeyReference.Date.Value).Days).Average()' 到 SQL 中,无法将其视为本地表达式。

似乎“减法”方法或“天数”属性没有转换为 SQL。我的第一个示例之所以有效,是因为第二个查询是 LINQ to objects。有谁知道是否有一种方法可以将 LINQ 查询转换为 SQL?

最佳答案

怎么样

double AvgDays = dates.Where(d => d.Date.HasValue)
.Average(dd => (dd.Date.Value-dd.OtherDate).Days);

但也许这样的东西更有用

var ticks = (long)dates.Where(d => d.Date.HasValue)
.Average(dd => (dd.Date.Value - dd.OtherDate).Ticks);

var avg = new TimeSpan(ticks);

Console.WriteLine("It's " + avg.Days + " days and " + avg.Hours + " hours and " + avg.Seconds + " seconds.");

关于c# - 使用可为空的日期时间获取计算项的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3834646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com