我有一个带有这个定义的类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));
这个查询是真的吗?我可以更好地编写查询吗?
答案 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);