【问题标题】:Subtract two dates with 'let' variable then average()?用'let'变量减去两个日期然后平均()?
【发布时间】:2015-10-22 01:09:53
【问题描述】:

尝试将两个日期相减以计算天数,然后在“let”变量avgConversion 上执行.Average()

我遇到以下错误; LINQ to Entities 无法识别方法 'System.TimeSpan Subtract(System.DateTime)' 方法,并且此方法无法转换为存储表达式。

var averageConversion =
(
    from r in db.Registrations
    where
        (bu == "All" || r.BusinessUnit.Equals(bu)) &&
        (region == "All" || r.Region.Equals(region)) &&
        (startDate == null || r.StartDate >= startDate) &&
        (endDate == null || r.EndDate <= endDate) &&
        !r.RegistrationStatus.Equals("Cancelled") &&
        !r.Status.Equals("Cancelled")
    let avgConversion = r.StartDate.Value.Subtract(r.RegistrationDate.Value).Days
    select avgConversion
).Average();

感谢 Enigma,最终解决了这个问题。

var dates = (from r in db.Registrations
                                 where
                                      (bu == "All" || r.BusinessUnit.Equals(bu)) &&
                                      (region == "All" || r.Region.Equals(region)) &&
                                      (startDate == null || r.StartDate >= startDate) &&
                                      (endDate == null || r.EndDate <= endDate) &&
                                      !r.RegistrationStatus.Equals("Cancelled") &&
                                      !r.Status.Equals("Cancelled")
                                 select new
                                 {
                                     r.RegistrationDate,
                                     r.StartDate
                                 }).ToList();

        var avgConversion = (from d in dates
                             let AvgConversion = d.StartDate.Value.Subtract(d.RegistrationDate.Value).Days
                             select AvgConversion).Average();

【问题讨论】:

  • 你有什么问题?

标签: linq date let entity-functions


【解决方案1】:

请记住,Entity Framework 将所有可能的 LINQ 语句的子集转换为 SQL。如果您使用无法翻译的方法或函数,则会收到“方法无法翻译成商店表达式”错误。

相反,您应该在进行计算之前将数据拉入内存,以便运行完整的 LINQ 表达式。

像这样:

var averageConversion =
(
    from r in db.Registrations
    where
        (bu == "All" || r.BusinessUnit.Equals(bu)) &&
        (region == "All" || r.Region.Equals(region)) &&
        (startDate == null || r.StartDate >= startDate) &&
        (endDate == null || r.EndDate <= endDate) &&
        !r.RegistrationStatus.Equals("Cancelled") &&
        !r.Status.Equals("Cancelled")
    select new
    {
        r.StartDate,
        r.RegistrationDate
    }
)
    .ToArray()
    .Select(r => r.StartDate.Value.Subtract(r.RegistrationDate.Value).Days)
    .Average();

【讨论】:

  • 谢谢你,我按照你的逻辑,但又打破了一点。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2012-06-07
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多