2011-02-18 28 views
0

我們有一個游泳者的時間數據庫。 要創建一個排名,我們希望獲得每個運動員的最快時間。從記錄中找到最短時間並將其分成LINQ

var rankings = ( 
    from r in _db.Results 
     orderby r.swimtime 
     group r by r.athleteid into rg 
     select new 
     { 
      AthleteId = rg.Key, 
      FirstName = rg.Min(f2 => f2.Athlete.firstname), 
      Swimtime = rg.Min(f8 => f8.swimtime), 
      hours = rg.Min(f9 => f9.swimtime.Hours), 
      minutes = rg.Min(f10 => ("00" + f10.swimtime.Minutes.ToString()).Substring(("00" + f10.swimtime.Minutes.ToString()).Length - 2)), // to get 2 digits in minutes 
      seconds = rg.Min(f11 => ("00" + f11.swimtime.Seconds.ToString()).Substring(("00" + f11.swimtime.Seconds.ToString()).Length - 2)), // to get 2 digits in seconds 
      milliseconds = rg.Min(f12 => (f12.swimtime.Milliseconds.ToString() + "00").Substring(0, 2)), // because miliseconds are not always filled 
     } 
    ); 

現在排名創建正確,但是顯示的時間不是。
我知道問題是什麼,但不知道如何解決它:

在數據庫中,我們有一個具有2次游泳:00:01:02:10(1min2sec10)和00:00: 56:95(56sec95)

我們得到的結果是分鐘(= 00)的最小值,秒的最小值(= 02)和毫秒的最小值(= 10)
因時間而產生00:00:02:10

我們應該得到的是小時,分鐘,秒,最快的時間毫秒(= 00:00:56:95)

任何人任何想法如何解決這一問題?

回答

1

這應該做的伎倆:

from result in db.Results 
group result by result.AthleteId into g 
let bestResult = (
    from athleteResult in g 
    orderby athleteResult.SwimTime 
    select athleteResult).First() 
orderby bestResult.SwimTime 
select new 
{ 
    AthleteId = bestResult.Athlete.Id, 
    FirstName = bestResult.Athlete.FirstName, 
    BestTime = bestResult.SwimTime, 
} 

查詢獲取來自一組最好的結果(從單一痤瘡各類的結果),訂單減少這一結果,並使用該結果來填充最終結果。

+0

試過這個,我得到了我的網頁游泳時間。然而,經過兩個小時的探索和嘗試,我仍然沒有按照我想要的方式將它格式化。 我想得到hh:mm:ss.00。有任何想法嗎 ? – 2011-02-18 20:59:54

+0

尋找將此時間跨度轉換爲日期時間然後格式化的方向。 大多數解決方案都是這樣做的: public DateTime GetDateTimeFromTimeSpan(TimeSpan timespan) { return DateTime.Now.Subtract(timespan); } 這仍然留下我與ASPX: 的 <%#( 「Swimtime」)%> 2011-02-18 21:50:07

0

遠離調用。首先放在組上,因爲由於LINQ組(鍵和元素)與SQL組(鍵和聚合)之間的區別,可能會導致自動重新請求。

取而代之,獲得minSwimTime一次並讓它成爲。

var rankings = 
    from r in _db.Results 
    group r by r.athleteid into rg 
    let minSwimTime = rg.Min(x => x.swimtime) 
    select new 
    { 
    AthleteId = rg.Key, 
    FirstName = rg.Min(f2 => f2.Athlete.firstname), 
    Swimtime = minSwimTime, 
    hours = minSwimTime.Hours, 
    minutes = ("00" + minSwimTime.Minutes.ToString()).Substring(("00" + minSwimTime.Minutes.ToString()).Length - 2), // to get 2 digits in minutes 
    seconds = ("00" + minSwimTime.Seconds.ToString()).Substring(("00" + minSwimTime.Seconds.ToString()).Length - 2), // to get 2 digits in seconds 
    milliseconds = minSwimTime.Milliseconds.ToString() + "00").Substring(0, 2), // because miliseconds are not always filled 
    }; 

另外 - 不要在數據庫中做字符串格式。數據庫服務器比將日期轉換爲文本要好。

相關問題