2009-01-15 20 views
1

我正在使用ObjectDataSource訪問業務類,並嘗試生成對用戶有意義的輸出。返回值描述一個類(如在課堂和教學中,而不是軟件)。我想把班級時間表示爲這樣一個範圍:「上午9:00 - 上午10:00」。使用Linq for ObjectDataSource:如何使用ToShortTimeString轉換日期時間?

這是我使用提取數據的LINQ查詢:

return classQuery.Select(p => new SelectClassData 
           { 
            ClassID = p.ClassID, 
            Title = p.Title, 
            StartDate = p.StartDate.ToShortDateString(), 
            EndDate = p.EndDate.ToShortDateString(), 
            TimeOfClass = 
            p.StartDate.ToShortTimeString() + " - " + 
                 p.EndDate.ToShortTimeString() 
           }).ToList(); 

正如你所看到的,我編碼的開始和結束時間的開始和結束日期,即使這些可能是不同的日期。

當我執行這個代碼,我得到:

「‘p.EndDate.ToShortTimeString()’無法轉換成表情SQL,不能把它當作一個局部表達。」

我知道我在預測結果,但是,對於Linq來說,我已經假設C#調用ToShortTimeString發生在投影之後。任何人都可以幫助我弄清楚如何獲得我正在尋找的字符串?

回答

3

原因是查詢正在使用LINQ to SQL。 LINQ to SQL將查詢視爲表達式樹。它具有爲某些方法定義的映射(例如,Contains),但由於它沒有真正執行它們,因此無法在任意方法上使用。它解析查詢並將其提交給SQL服務器。查詢的等價物將作爲數據庫服務器上的SQL語句執行,結果將返回。問題是ToShortTimeString()在LINQ to SQL中沒有等效的SQL轉換。這裏使用的技巧是從SQL服務器獲取數據並調用客戶端的方法(AsEnumerable將執行此操作)。

return classQuery.Select(p => new { p.ClassID, p.Title, p.StartDate, p.EndDate }) 
    .AsEnumerable() 
    .Select(p => new SelectClassData { 
     ClassID = p.ClassID, 
     Title = p.Title, 
     StartDate = p.StartDate.ToShortDateString(), 
     EndDate = p.EndDate.ToShortDateString(), 
     TimeOfClass = p.StartDate.ToShortTimeString() + " - " + p.EndDate.ToShortTimeString() }) 
    .ToList(); 
0

我很喜歡Mehrdad的回答。它不僅解決了問題,而且還教給我一些關於Linq的知識。謝謝!

雖然我一直在關注這個問題,並且確實想出了一個不同的方法,我會在這裏描述這個問題,以防其他人在這個問題上磕磕絆絆。我的LINQ to SQL代碼現在顯示:

return classQuery.Select(p => new SelectClassData 
           { 
            ClassID = p.ClassID, 
            Title = p.Title, 
            sDate = p.StartDate, 
            eDate = p.EndDate 
           }).ToList(); 

注意SDATE和EDATE現在的DateTime對象,而不是字符串。在「SelectClassData」對象,我只是改變了聲明,使訪問開始日期,結束日期和TimeOfClass變量經過一個屬性的getter:

public class SelectClassData 
{ 
    public int ClassID { get; set; } 
    public string Title { get; set; } 
    public DateTime sDate { get; set; } 
    public DateTime eDate { get; set; } 
    public string StartDate { get { return GetSDate(); } } 
    public string EndDate { get { return GetEDate(); } } 
    public string TimeOfClass { get { return GetTimeOfClass(); } } 

    protected string GetSDate() 
    { 
     return sDate.ToShortDateString(); 
    } 

    protected string GetEDate() 
    { 
     return eDate.ToShortDateString(); 
    } 

    protected string GetTimeOfClass() 
    { 
     return sDate.ToShortTimeString() + " - " + eDate.ToShortTimeString(); 
    } 
} 

也就是說,我通過LinqToSql設置SDATE和EDATE但做通過在目標數據類中實現Linq檢索,在之後的「ToShortTimeString」和「ToShortDateString」轉換

相關問題