web-dev-qa-db-ja.com

LINQ-どこの状態で最大

私はこの定義を持つクラス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));

このクエリは本当ですか?これよりも優れたクエリを作成できますか?

11
Shayan

PlanProgress > 0には最新のEndDateがあります。

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

得られた結果の観点から、このクエリは正しいようです。

ただし、内部クエリでは、コレクション内の要素ごとに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);
4
ILya
     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++;