用 'let' 变量减去两个日期然后 average()?
Subtract two dates with 'let' variable then average()?
尝试将两个日期相减以计算天数,然后对 '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();
请记住,Entity Framework 将所有可能的 LINQ 语句的 子集 转换为 SQL。如果您使用无法翻译的方法或函数,您会收到 "method cannot be translated into a store expression" 错误。
相反,您应该在进行计算之前将数据提取到内存中,以便您可以 运行 完整的 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();
尝试将两个日期相减以计算天数,然后对 '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();
请记住,Entity Framework 将所有可能的 LINQ 语句的 子集 转换为 SQL。如果您使用无法翻译的方法或函数,您会收到 "method cannot be translated into a store expression" 错误。
相反,您应该在进行计算之前将数据提取到内存中,以便您可以 运行 完整的 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();