簡體   English   中英

在SQL CE數據庫上的Entity Framework中使用DateDiff

[英]Using DateDiff in Entity Framework on a SQL CE database

我有一個方法應該返回一個匿名對象列表與計算列,如下所示:

        var tomorrow = DateTime.Today.AddDays(1);
        return from t in this.Events
                where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
                select new
                {
                    Client = t.Activity.Project.Customer.Name,
                    Project = t.Activity.Project.Name,
                    Task = t.Activity.Task.Name,
                    Rate = t.Activity.Rate.Name,
                    StartTime = t.StartTime,
                    EndTime = t.EndTime.Value,
                    Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime.Value) / 60),
                    Description = t.Activity.Description
                };

不幸的是,我從DateDiff函數中得到以下錯誤:

類型為System.Data.Objects的指定方法'System.Nullable 1[System.Int32] DateDiff(System.String, System.Nullable 1 [System.DateTime],System.Nullable .1 [System.DateTime])' .SqlClient.SqlFunctions'無法轉換為LINQ to Entities存儲表達式

我在這里做錯了什么想法?

編輯:我也嘗試過這里提到的EntityFunctions類,但是這樣做不起作用。

Minutes = EntityFunctions.DiffMinutes(t.EndTime, t.StartTime),

[編輯]

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("mi", t.StartTime, t.EndTime.Value) / 60)

SQL CE不受支持。

Hours = ((TimeSpan)(t.EndTime.Value - t.StartTime)).TotalHours

拋出DbArithmeticExpression異常

所以,我認為你必須分兩步完成。 獲取所需的數據,然后計算內存中的時間差。

var events = (from t in context.Events
    where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
    select t).ToArray();

return from t in events
    select new
    {
         ...
         Hours = (t.EndTime.Value - t.StartTime).TotalHours
    };

您要求EF提供程序處理SQL中的DATEDIFF,我認為在任何版本的SQL中都不可能。 使用本機DateTime函數:

var tomorrow = DateTime.Today.AddDays(1);
        return from t in this.Events
                where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
                select new
                {
                    Client = t.Activity.Project.Customer.Name,
                    Project = t.Activity.Project.Name,
                    Task = t.Activity.Task.Name,
                    Rate = t.Activity.Rate.Name,
                    StartTime = t.StartTime,
                    EndTime = t.EndTime.Value,
                    Hours = t.EndTime.Value(t.StartTime.Subtract).Hours,
                    Description = t.Activity.Description
                };

兩種可能性,從EndTime中刪除Value:

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime) / 60) 

或者使用DateDiffHour:

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiffHour(t.StartTime, t.EndTime)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM