C# 在where条件下的LINQ-Max
我有一个定义如下的类TaskWeekUI:C# 在where条件下的LINQ-Max,c#,linq,max,where,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 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));
这是真的吗?我能写出比这更好的查询吗?从得到的结果来看,这个查询似乎是正确的 但是在您的内部查询
tis.Where(p=>p.PlanProgress!=null&&p.PlanProgress>0)中,使用t.PlanProgress>0
为集合中的每个元素计算Max(w=>w.EndDate)
因此,在查询之外获得最大值的更好方法如下:
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始终为true,因为p.PlanProgress不是可为null的类型。所以我们的代码变成这样:
var max = tis.Where(p => p.PlanProgress > 0).Max(w => w.EndDate);
tis.First( t => t.PlanProgress > 0 && t.EndDate == max);
或者,您可以更改类的定义,并将p.PlanProgress设置为可空类型:
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);
您不需要将PlanProgress与null进行比较,因为double是结构类型,它不能为null 如果希望TaskWeekUI具有最大结束日期和正计划进度,可以尝试以下代码:
TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0).Max(w => w.EndDate);
我想您想要的是
PlanProgress>0
最近的EndDate
TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0)
.OrderByDescending(t => t.EndDate)
.FirstOrDefault();
对不起,我编辑并添加了查询,我忘记了。
p=>p.PlanProgress!=在您的Where
clauseTnx中不需要null
,但是我可以在Where条件下为max编写一个查询吗?请参阅:它的可能重复项将最终将DateTime
分配给taskwekui
无法隐式地将类型“System.DateTime”转换为“taskwekui”+1,我唯一想更改的是将First
更改为First或default
,除非他能保证始终存在PlanProgress>0
+1的项目,但我认为如果“collection”为空,“collection.Max”会引发异常,因此在设置“Max”之前可能需要进行额外的检查。如果所有PlanProgress 0我假设PlanProgress+1,集合将为空,这是一个很好的清晰解决方案,没有使用Max.Tnx引入的任何额外异常,我认为这是一个最好的简单解决方案。仅仅为了获得具有最高结束日期的项目而对整个列表进行排序不是浪费时间吗?看起来是个更好的解决办法。@JuanLuisSoldi:你说得对。最好的解决方案应该是O(n)。但无论如何,它是可以接受的,并且是基于内置LINQ函数的最佳解决方案。
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++;