私はこの定義を持つクラス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));
このクエリは本当ですか?これよりも優れたクエリを作成できますか?
PlanProgress > 0
には最新のEndDate
があります。
TaskWeekUI ti = tis.Where(t => t.PlanProgress > 0)
.OrderByDescending(t => t.EndDate)
.FirstOrDefault();
得られた結果の観点から、このクエリは正しいようです。
ただし、内部クエリでは、コレクション内の要素ごとにtis.Where(p => p.PlanProgress != null && p.PlanProgress > 0).Max(w => w.EndDate)
がt.PlanProgress > 0
で計算されます。
したがって、次のようにクエリの外部で最大値を取得するためのより良い方法です。
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はNullable型ではないため、p.PlanProgress!= nullは常にtrueです。したがって、コードは次のようになります。
var max = tis.Where(p => p.PlanProgress > 0).Max(w => w.EndDate);
tis.First( t => t.PlanProgress > 0 && t.EndDate == max);
または、クラスの定義を変更して、null許容型の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);
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++;