使用此代码:
i.SpesaAlloggio = db.TDP_NotaSpeseSezB.Sum(p => p.Costo / (((DateTime)p.DayEnd)
.Subtract((DateTime)p.DayStart).Days + 1));
我收到此错误:
LINQ to Entities does not recognize the method
'System.TimeSpan Subtract(System.DateTime)' method, and this method cannot be
translated into a store expression.
我该怎么做?
答案 0 :(得分:1)
使用计算出的数据库字段并对其进行映射。或者使用SqlFunctions
和EF 4作为LukLed建议(+1)。
答案 1 :(得分:0)
我写了一个删除时间的函数: public static DateTime RemoveHours(DateTime date) { int year = date.Year; int month = date.Month; int day = date.Day; 返回新的DateTime(年,月,日); }
并更改了过滤条件: var query = 来自上下文中的trn.IdentityTransactions 其中trn.ClientUserId == userId&& trn.DateDeleted == null orderby trn.DateTimeCreated 选择新的 { ClientServerTransactionID = trn.ClientServerTransactionID, DateTimeCreated = trn.DateTimeCreated, ServerTransDateTime = trn.ServerTransDateTime, 时间戳= trn.Timestamp, Remarc = trn.Remarc, ReservedSum = trn.ReservedSum, };
if (dateMin.HasValue && dateMin.Value > DateTime.MinValue)
{
DateTime startDate = Converters.RemoveHours(dateMin.Value);
query = from trn in query
where trn.DateTimeCreated >= startDate
select trn;
}
if (dateMax.HasValue && dateMax.Value > DateTime.MinValue)
{
var endDate = Converters.RemoveHours(dateMax.Value.AddDays(1.0));
query = from trn in query
where trn.DateTimeCreated < endDate
select trn;
}
dateMin和dateMax是可以为空的类型,在我的情况下可能没有设置。
答案 2 :(得分:-1)
尝试(它不是很有效,但它会起作用):
i.SpesaAlloggio = db.TDP_NotaSpeseSezB.ToList()
.Sum(p => p.Costo / (((DateTime)p.DayEnd)
.Subtract((DateTime)p.DayStart).Days + 1));
编辑:对于大型表格来说这会非常慢,因为它会从服务器传输整个表格内容
实体框架尝试将您的表达式转换为SQL,但它无法处理((DateTime)p.DayEnd).Subtract((DateTime)p.DayStart)
。你必须使它更简单。 ToList()
获取所有行,然后在应用程序端进行计算,而不是在数据库中进行计算。
使用EF4,您可以使用SqlFunctions DateDiff
使用EF1,您可以使用此字段创建计算字段或视图,并根据此字段进行计算。