2017-08-11 136 views
2

我有一組通過,我想找到兩個日期之間的差值,然後將結果添加到最終的總和。但是我不斷收到無法從時間跨度轉換爲Long的錯誤。 這是我使用的代碼:LINQ的日期時間差和

var summary = (
    from p in db.CP_SDV_Acc 
    where p.Scandate >= start && p.EndDate <= end && p.Device==divice 
    let k = new 
    { 
    //try this if you need a date field 
    // p.SaleDate.Date.AddDays(-1 *p.SaleDate.Day - 1) 
    Device = p.Device, 
    } 
    group p by k into t 
    select new OeeRecovery 
    { 
    Device = t.Key.Device, 

    GoodPcs = t.Sum(p => p.GoodPcs), 
    BadPcs=t.Sum(p=>p.BadPcs), 
    Oee =(decimal)(t.Sum(p => p.GoodPcs)- t.Sum(p => p.BadPcs))/t.Sum(p => p.GoodPcs), 
    WorkTime = t.Sum(x=>new TimeSpan(x.EndDate-x.Scandate).TotalMilliseconds??TimeSpan.Zero) 

    //t.Sum(new TimeSpan(p => p.EndDate - p.Scandate)) 
    //t.Aggregate(TimeSpan.Zero, (total, it) =>total += (it.EndDate-it.Scandate)), 
}).ToList(); 

WorkTimeTimeSpan類型和EnddatescandateDateTime類型。
我怎麼能得到時間跨度的總和?

+0

確實與空聚結操作者此表達式(''??)甚至編譯? 'new'將總是返回一個實例,所以你期望在這裏有什麼?請注意,'TotalMilliseconds'是一個'double','TimeSpan.Zero'是一個'TimeSpan'。 –

+0

我得到的(x.EndDate-x.Scandate)錯誤此 – user3399295

+0

最快的修復(只是爲了得到它沒有失敗,將TimeSpan.Zero改變TimeSpan.Zero.TotalMilliseconds。然後,兩個空的部分coalese將返回相同的類型,然後它會自動裝箱到Long。此外,你不需要新的TimeSpan,因爲減去兩個日期值會返回一個TimeSpan,所以你可以這樣做:(x.EndDate- x.ScanDate).TotalMilliseconds ?? TimeSpan.Zero.Milliseconds,或者更簡單(x.EndDate-x.ScanDate).TotalMilliseconds ?? 0 –

回答

0

這是一項具有挑戰性的任務,主要是因爲LINQ to Entities不支持DateTimeTimeSpan的大多數CLR方法/屬性/運算符。

我看到的唯一的解決辦法是使用DbFunctions.DiffSeconds規範函數來獲得在幾秒鐘的差別,總結起來,然後用另一典型功能DbFunctions.CreateTime轉換爲TimeSpan,手工計算小時,分鐘和秒的總秒數:

... 
group p by k into t 
let workSecs = t.Sum(x => DbFunctions.DiffSeconds(x.Scandate, x.EndDate)) ?? 0 
select new OeeRecovery 
{ 
    ... 
    WorkTime = DbFunctions.CreateTime(workSecs/3600, (workSecs/60) % 60, workSecs % 60) 
    ... 
} 
+0

「轉換失敗時,轉換日期和/或Ť從字符串輸入法。」我沒有看到有什麼字符串,它只是崩潰在運行時 – user3399295

+0

我沒有看到任何。這是你唯一可以弄明白的東西,因爲我用'DateTime'字段在樣本表上測試了上述構造,並且它可以工作。你可以從'let workSecs = ...'和'WorkTime = ...'這兩行註釋掉,看看你是否仍然得到運行時異常。 –