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

现在排名已正确创建,但显示的时间不正确。
我知道问题出在哪里,但不知道如何解决:

在数据库中,我们有一个游泳者有 2 次:00:01:02:10 (1min2sec10) 和 00:00:56:95 (56sec95)

我们得到的结果是分钟的最小值 (=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,  
}

该查询从一组中获取最佳结果(所有结果来自单个运动员),按该结果排序,并使用该结果填充最终结果。

于 2011-02-18T15:24:38.857 回答
0

不要在组上调用 .First ,因为由于 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
  };

另外 - 不要在数据库中进行字符串格式化。数据库服务器有比将日期时间转换为文本更好的事情要做。

于 2011-02-18T15:28:24.633 回答