使用linq在linq查询中查找MIN(日期)

本文关键字:linq 日期 MIN 查询 使用 查找 | 更新日期: 2023-09-27 18:26:34

我正在使用linq来提取数据。此数据包含一个日期和一些其他值。问题是,这些日期可以多次出现,因为这些日期可以具有相同的值,但时间戳不同。我想提取具有最早时间戳的匿名类型。我怎么能在林克做到这一点?

这是我的代码:

var result = (from a in UnitOfWork.ActivityLessonParticipantService.Query
                         .Where(a => a.ActivityLesson.Activity.Id == activityId)
                         .Where(a => a.ActivityLesson.From >= startDate && (a.ActivityLesson.To == startDate || a.ActivityLesson.To <= endDate)).OrderBy(d => d.ActivityLesson.From)
                          where !a.ActivityLesson.IsDeleted && !a.ActivityLesson.Activity.IsDeleted && a.Appeared == true
                          select new
                          {
                              CPR = a.User.UserName,
                              FullName = a.User.FullName,
                              ActivityFromDate = a.ActivityLesson.From,
                          }).OrderBy(c => c.CPR).ToList();

感谢

使用linq在linq查询中查找MIN(日期)

您可以GroupBy DateTimeDate属性,然后按DateTime对该组进行排序,并使用First仅拾取第一条记录/对象:

var query = from a in UnitOfWork.ActivityLessonParticipantService.Query
             where a.ActivityLesson.Activity.Id == activityId
                && a.ActivityLesson.From >= startDate 
                && (a.ActivityLesson.To == startDate || a.ActivityLesson.To <= endDate)
                && !a.ActivityLesson.IsDeleted 
                && !a.ActivityLesson.Activity.IsDeleted 
                && a.Appeared
             select a;
var firstByDate = query.GroupBy(a => a.ActivityLesson.From.Date)
    .Select(grp => grp.OrderBy(a => a.ActivityLesson.From).First())
    .OrderBy(a => a.User.UserName)
    .Select(a => new
    {
        CPR = a.User.UserName,
        FullName = a.User.FullName,
        ActivityFromDate = a.ActivityLesson.From,
    }).ToList();

由于LINQ的延迟执行,这实际上是在最终ToList执行的单个查询。我将查询语法和方法语法混合在一起,因为当涉及到GroupBy时,我更喜欢方法语法,但这是一个品味问题。