LINQ- Max在哪里条件

时间:2010-12-30 11:04:17

标签: c# linq max where

我有一个带有这个定义的类TaskWeekUI:

 public class TaskWeekUI    {
   public Guid TaskWeekId { get; set; }
   public Guid TaskId { get; set; }
   public Guid WeekId { get; set; }
   public DateTime EndDate { get; set; }
   public string PersianEndDate { get; set; }
   public double PlanProgress { get; set; }
   public double ActualProgress { get; set; }    } 

我写了这个查询:

 TaskWeekUI ti =  tis.First( t => t.PlanProgress > 0 && t.EndDate ==  tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate));

这个查询是真的吗?我可以更好地编写查询吗?

4 个答案:

答案 0 :(得分:33)

我认为你想要PlanProgress > 0最近有EndDate的人。

TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0)
                   .OrderByDescending(t => t.EndDate)
                   .FirstOrDefault();

答案 1 :(得分:4)

从获得的结果的角度来看,这个查询似乎是正确的。

但是在您的内部查询中tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate)是使用t.PlanProgress > 0

为集合中的每个元素计算的

因此,它是一种在查询之外获取Max值的更好方法,如下所示:

var max = tis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate);
tis.First( t => t.PlanProgress > 0 && t.EndDate == max);

更进一步p.PlanProgress!= null总是正确的,因为p.PlanProgress不是Nullable类型。所以我们的代码就像这样:

var max = tis.Where(p => p.PlanProgress > 0).Max(w => w.EndDate);
    tis.First( t => t.PlanProgress > 0 && t.EndDate == max);

或者您可以更改类的定义并使p.PlanProgress为Nullable类型:

public class TaskWeekUI    {
   public Guid TaskWeekId { get; set; }
   public Guid TaskId { get; set; }
   public Guid WeekId { get; set; }
   public DateTime EndDate { get; set; }
   public string PersianEndDate { get; set; }
   public double? PlanProgress { get; set; }
   public double ActualProgress { get; set; }    
} 

var max = tis.Where(p => p.PlanProgress.HasValue && p.PlanProgress.Value > 0).Max(w => w.EndDate);
    tis.First( t => t.PlanProgress.HasValue && t.PlanProgress.Value > 0 && t.EndDate == max);

答案 2 :(得分:0)

     var max_Query =
                   (from s in db.Songs
                    join bk in db.Albums on s.BookId equals addAlbumDetailsViewModel.BookId
                    select s.SongId).Max();
                            max_Query++;

答案 3 :(得分:-1)

您不需要将PlanProgress与null进行比较,因为double是结构类型,它不能为null。

如果您想要使用Max EndDate和正PlanProgress的TaskWeekUI,您可以尝试以下代码:

TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0).Max(w => w.EndDate);