2012-09-03 32 views
1

我想減去兩個日期,並獲得在時間跨度值爲例減去Linq中的兩個Date到返回的時間跨度

TimeSpan duration = Convert.ToDateTime(completeDate).Subtract(Convert.ToDateTime(lastRundate));

這是正常執行的實體。如何才能做到這一點在LINQ到實體的實體框架,其中

from job in Jobs 
    select new JobEntity 
    {             
    Duration = job.CompleteDate.Value.Subtract(job.NextRunDate.Value) 
    }; 

哪裏喬布斯是我的表,CompleteDate & NextRunDate是數據類型的日期時間我的列名? (因爲它允許空值) 當我嘗試這種代碼,它給了我這個錯誤

LINQ到實體無法識別方法「System.TimeSpan減(的System.DateTime)」的方法,而且這種方法不能翻譯成商店表達。 請讓我知道如何去做這件事。 在此先感謝

回答

2

爲什麼不延長您的JobEntity模型?

public DateTime NextRunDate { get; set; } 
public DateTime CompletedDate { get; set; } 
public Timespan Duration 
{ 
    get 
    { 
     return CompleteDate.Subtract(NextRunDate) 
    } 
} 
0

您可以在生成的對象上調用AsEnumerable(),然後對IEnumerable-Object進行減法運算。

var jobs = Jobs.AsEnumerable().Select(j => new JobEntity 
{ 
    Duration = j.CompleteDate.Value.Subtract(j.NextRunDate.Value) 
}); 
+0

它是'AsEnumerable()',而不是ToEnumerable()。另外值得一提的是,這會將具有所有屬性的完整'Job'實體加載到內存中。財產選擇發生在內存中。所以不必要的加載屬性會有一些開銷。您可以先投影到一個匿名類型中,該類型只包含所需的'CompleteDate'和'NextRunDate'屬性,然後在內存中應用'AsEnumerable()'和'Select'到'Duration'中。 – Slauma

+0

@Slauma你說得對,我已經改變了'AsEnumerable()' – SeToY

1

你可以嘗試使用EntityFunctions

from job in Jobs 
select new JobEntity 
{             
    Duration = EntityFunctions.DiffSeconds(job.CompleteDate, job.NextRunDate) 
}; 

您在此您的代碼文件需要using System.Data.Objects;。它將以秒爲單位返回時間跨度爲int

+1

EntityFunctions已被棄用。改用DbFunctions.DiffHours()。 – Bassem