6

選択した値を個別の日付の昇順で並べ替えたい。

たとえば、データベースにこれらの値があります。

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 日の値があるため、これら 2 つの日付を個別の日付値のリストに選択したいと考えています。しかし、ID 5 と 6 の両方の値は 0 です。したがって、値が 0 の場合、値 0 も追加する必要があります。

今私の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 日の値が同じ場合など、個別の値を選択したくありません。これらの両方の値を追加したいと思います。

4

3 に答える 3

5

最初のクエリから必要なものを最初に選択することをお勧めします。

 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 がValue例のフィールドに対応すると想定しました。

次に、日付でグループ化し、降順で並べ替え、各グループから最初の項目を選択します。

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();
于 2012-05-02T09:47:59.850 に答える
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)                           
).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はグループが取り組んだキーなので、これは になりますDate。2 番目のプロパティは時間の集計であるため、個別の日付ごとに時間が合計されます。キーワードを使用しているnewため、結果は新しいカスタム オブジェクトに入れられます。新しいオブジェクトのプロパティの名前を定義したので、2 つになりますDateHour

于 2012-05-02T09:40:58.670 に答える
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();
于 2012-05-02T09:20:25.730 に答える