C# 按不同日期排序时选择值tolist()

C# 按不同日期排序时选择值tolist(),c#,silverlight,linq,entity-framework,linq-to-sql,C#,Silverlight,Linq,Entity Framework,Linq To Sql,我想按不同日期升序排列所选值 例如,我的数据库中有这些值 ID | Value | Date 1 | 35 | 2012/01/20 2 | 0 | 2012/01/20 3 | 10 | 2012/02/01 4 | 0 | 2012/02/01 5 | 0 | 2012/03/01 6 | 0 | 2012/03/01 由于ID 1在1月20日有一个值,ID 3在2月1日有一个值,我希望将这两个日期选择到我的不同日期值列表中。但对于

我想按不同日期升序排列所选值

例如,我的数据库中有这些值

ID | Value | Date 
 1 | 35    | 2012/01/20
 2 | 0     | 2012/01/20
 3 | 10    | 2012/02/01
 4 | 0     | 2012/02/01
 5 | 0     | 2012/03/01
 6 | 0     | 2012/03/01
由于ID 1在1月20日有一个值,ID 3在2月1日有一个值,我希望将这两个日期选择到我的不同日期值列表中。但对于ID 5和6,两者的值均为0。因此,如果值为0,我还希望添加值0

 var totalHours = (from u in context.Users
                          join r in context.Reports on u.Id equals r.UserId
                          join w in context.Weeks on r.Id equals w.ReportId
                          join d in context.Days on w.DayId equals d.Id
                          orderby d.Date ascending
                          where r.weekNr.Equals(currentWeek)
                          select d.Hour).Distinct().OrderByDescending( n => n ).ToList();
现在我的linqquery看起来像这样

        var totalHours = (from u in context.Users
                          join r in context.Reports on u.Id equals r.UserId
                          join w in context.Weeks on r.Id equals w.ReportId
                          join d in context.Days on w.DayId equals d.Id
                          orderby d.Date ascending
                          where r.weekNr.Equals(currentWeek)
                          select d.Hour).ToList();
但是这个查询的结果当然是35,0,10,0,0,0。 虽然我希望它能给我35,10,0


我不想挑出不同的值,比如说2月1日和2月2日的值是否相同。我希望这两个值都被添加。

您的意思是希望它在日期上分组并聚合小时数。如果是这样的话,可能是这样的吗

 var totalHours = (from u in context.Users
                          join r in context.Reports on u.Id equals r.UserId
                          join w in context.Weeks on r.Id equals w.ReportId
                          join d in context.Days on w.DayId equals d.Id
                          orderby d.Date ascending
                          where r.weekNr.Equals(currentWeek)
                          select d.Hour).Distinct().OrderByDescending( n => n ).ToList();
 var totalHours = (from u in context.Users                           
join r in context.Reports on u.Id equals r.UserId                           
join w in context.Weeks on r.Id equals w.ReportId                           
join d in context.Days on w.DayId equals d.Id                           
orderby d.Date ascending                           
where r.weekNr.Equals(currentWeek)                           
).GroupBy(n => n.Date).Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }).ToList(); 
只是解释一下

.GroupBy(n => n.Date)
将按日期对结果进行分组,以便每个日期都有一行

.Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) })

将选择并塑造结果。我们正在形成一个新的物体
n.Key
是group by处理的键,因此这将是
Date
。第二个属性是小时数的总和,因此每个不同的日期都将对其小时数进行求和。我们正在使用
new
关键字,以便将结果放入新的自定义对象中。我们已经定义了新对象属性的名称,因此将有两个-
日期
小时

我建议首先从第一个查询中选择您需要的内容:

 var totalHours = (from u in context.Users
                          join r in context.Reports on u.Id equals r.UserId
                          join w in context.Weeks on r.Id equals w.ReportId
                          join d in context.Days on w.DayId equals d.Id
                          orderby d.Date ascending
                          where r.weekNr.Equals(currentWeek)
                          select new {id = r.UserId, hour = d.Hour, date = d.Date}).ToList();
在上面的例子中,我假设d.Hour对应于示例中的
字段

然后按日期分组,按小时降序,并从每组中选择第一项:

var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .OrderByDescending(v => v.Max(o => o.Hour))
                .Select(g => g.First());
更新

要仅返回Hour属性的整数列表,请使用此语句而不是上述语句:

 var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .OrderByDescending(v => v.Max(o => o.Hour))
                .Select(g => g.First().Hour)
                .ToList();
更新2

你能试试这个吗

var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .Select(g => g.OrderByDescending(e => e.Hour))
                .Select(g => g.First().Hour)
                .ToList();

您想按值对列表进行分组和排序吗?@rickard-因此,如果有一个值不是0(id 1),然后是另一个值是0(id 2),您只需要非零的值?ID1=35,ID2=50会发生吗?如果是,您想两者都要吗?@Joanna如果同一日期的值相等(在本例中为0),我还想将值0添加到列表()。@Joanna不,这是不可能的。但可能两个值都是0。我不想挑出不同的值,只想挑出不同的日期。因此,如果有多个日期,例如2月1日和2月2日具有相同的值。这种方法只给我一天的时间。是的,这是我所追求的结果。但是我不理解这段代码中的所有内容,它给了我错误,所以我无法正确测试它。“查询体必须以select子句或group子句结尾”和“不能隐式地将类型'System.Collections.Generic.List'转换为'System.Collections.Generic.List'”以及“select子句中表达式的类型不正确。调用“Select”时类型推断失败。“确定-让分组依据处理联接是一个棘手的问题。此帖子提供了指针。如果我有时间,我将重新处理。分组依据(n=>)在n.date上没有给我任何信息。经过一些更正,此代码现在只给我一个错误代码”无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”完成这些步骤后是否要返回disticntValues?尝试获取此错误时,“无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(是否缺少转换?),如果我将.ToList()放在.Select(g=>g.First()).ToList()之后,则得到“无法隐式转换类型”System.Collections.Generic.List“到”System.Collections.Generic.List”“@rickard-是的,
distinctValue
应该是您要寻找的。如果您只需要匿名类型中的一个属性,则将最后一行更改为
。选择(g=>g.First().Hour)
(或您需要的任何其他属性)。ToList()调用应该可以正常工作,并为您提供
int
s的列表-请参阅updateFabulous!!它正在工作,我只是必须删除。OrderbyDescdending(Max),因为我不想按最高值排序!感谢you@rickard-我相信这是一个误会-
OrderByDescending
不会对结果整数列表中的值进行排序。必须获得组内的最高值-即,如果您有一个具有
{0,35}
的组,并且0是第一个值,而没有
OrderByDescending
则在结果列表中会得到零而不是35。所以我建议把订单放回去。