从记录中查找最短时间并在LINQ中拆分

从记录中查找最短时间并在LINQ中拆分,linq,min,Linq,Min,我们有一个游泳运动员的时间数据库。 为了创建排名,我们希望每个运动员都能以最快的速度完成比赛 var rankings = ( from r in _db.Results orderby r.swimtime group r by r.athleteid into rg select new { AthleteId = rg.Key, FirstName

我们有一个游泳运动员的时间数据库。 为了创建排名,我们希望每个运动员都能以最快的速度完成比赛

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)

我们得到的结果是分钟(=00)、秒(=02)和毫秒(=10)的最小值
导致时间为00:00:02:10

我们应该得到最快时间的小时、分、秒和毫秒(=00:00:56:95)


有人知道如何解决这个问题吗?

这应该可以做到:

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

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

远离调用。首先是组,因为由于LINQ的组(键和元素)与SQL的组(键和聚合)之间的差异,这可能会导致自动重新查询

相反,只需要一次时间就可以了

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

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

尝试了这一点,我在页面中获得了swimtime。然而,经过两个小时的搜索和尝试,我仍然没有得到我想要的格式。我想得到hh:mm:ss.00。有什么想法吗?看看如何将这个时间跨度转换成日期时间,然后格式化它。大多数解决方案都是这样做的:public DateTime GetDateTimeFromTimeSpan(TimeSpan TimeSpan){return DateTime.Now.Subtract(TimeSpan);}这仍然给我留下了aspx:格式化时间不是LINQ特有的问题。请尝试在此处开始一个新问题,以便对其进行格式化。此时最好不要让数据库格式化。做一个
排名。取(100).ToArray()
以确保您使用LINQ to对象。好的,所以我使用您的“let”并将选择调整为。。。。啊。。。。我如何在前端格式化它?