0

私たちは水泳選手とそのタイムのデータベースを持っています。ランキングを作成するには、各アスリートの最速タイムを取得します。

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  
        }
    );

ランキングは正しく作成されるようになりましたが、表示される時間が正しくありません。
問題が何であるかはわかっていますが、それを修正する方法がわかりません:

データベースには、00:01:02:10 (1min2sec10) と 00:00:56:95 (56sec95) の 2 つのスイマーがあります。

得られる結果は、分単位の最小値 (=00)、秒単位の最小値 (=02)、およびミリ秒単位の最小値 (=10)
であり、時間は 00:00:02:10 になります。

取得する必要があるのは、最速の時、分、秒、およびミリ秒 (=00:00:56:95) です。

これを修正する方法についてのアイデアはありますか?

4

2 に答える 2

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,  
}

クエリは、グループ (1 人のアスリートからのすべての結果) から最良の結果をフェッチし、その結果で並べ替え、その結果を使用して最終結果を入力します。

于 2011-02-18T15:24:38.857 に答える
0

LINQ のグループ (キーと要素) と SQL のグループ (キーと集計) の違いにより、自動再クエリが発生する可能性があるため、グループで .First を呼び出さないでください。

代わりに、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
  };

また、データベースで文字列の書式設定を行わないでください。データベース サーバーには、日時をテキストに変換するよりも優れた機能があります。

于 2011-02-18T15:28:24.633 に答える