与linq的日期差异

时间:2010-03-01 15:47:33

标签: linq entity-framework

使用此代码:

 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.

我该怎么做?

3 个答案:

答案 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,您可以使用此字段创建计算字段或视图,并根据此字段进行计算。