簡體   English   中英

LINQ- Max在哪里條件

[英]LINQ- Max in where condition

我有一個帶有這個定義的類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為集合中的每個元素計算的。

因此,它是一種在查詢之外獲取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);
     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++;

您不需要將PlanProgress與null進行比較,因為double是結構類型,它不能為null。

如果你想要TaskWeekUI與Max EndDate和積極PlanProgress你可以嘗試這個代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM