Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在where条件下的LINQ-Max_C#_Linq_Max_Where - Fatal编程技术网

C# 在where条件下的LINQ-Max

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; }

我有一个定义如下的类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));

这是真的吗?我能写出比这更好的查询吗?

从得到的结果来看,这个查询似乎是正确的

但是在您的内部查询
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++;