1

イベントというテーブルがあり、これらはEndDate列の例です。

ここに画像の説明を入力してください

これらのイベントから月を抽出しようとしていますが、次のようにしたいと思います11, 12, 1(現在の年から11と12、来年から1は2013年)。

var ev = db.Events.Select(d => new { Month = d.StartDate.Value.Month, 
                                     EndDate = d.EndDate })
                  .Where(d => (d.EndDate >= DateTime.Now
                           || (   d.EndDate.Value.Day == DateTime.Now.Day 
                               && d.EndDate.Value.Month >= DateTime.Now.Month) ))
                  .OrderBy(d => d.EndDate.Value.Year)
                  .Select(d => new { Month = d.Month }).Distinct();

さて、なぜこのクエリが機能しないのかわかりません。それは月を次のように抽出します:1, 11, 12もちろん、これは私が望むものではありません...

where追伸:からのイベントのみをフィルタリングする句は無視できますnow on

4

4 に答える 4

3

年のみで並べ替えて.OrderBy(d => d.EndDate.Value.Year)いますが、おそらく並べ替えたいと思いますd.EndDate.Value

年のみが日付の日/月の部分を無視します...したがって、リストの「最初の」2012が最初の項目です。

    var events = new List<DateTime>
    {
        new DateTime(2013,11,1),
        new DateTime(2013,5,1),
        new DateTime(2013,4,1),
        new DateTime(2012,12,29),
        new DateTime(2012,12,28)
    };

    var ev = events.Select(d => new { Month = d.Month, Date = d })
        .Where(d => (d.Date >= DateTime.Now || (d.Date.Day == DateTime.Now.Day && d.Date.Month >= DateTime.Now.Month)))
        .OrderBy(d => d.Date.Year)
        .Select(d => new { Month = d.Month })
        .Distinct();

戻ります12,11,5,4

var ev = events.Select(d => new { Month = d.Month, Date = d })
                .Where(d => (d.Date >= DateTime.Now || (d.Date.Day == DateTime.Now.Day && d.Date.Month >= DateTime.Now.Month)))
                .OrderBy(d => d.Date)
                .Select(d => new { Month = d.Month })
                .Distinct();

戻ります12,4,5,11

于 2012-11-20T09:10:39.613 に答える
1

Enumerable.Distinct()これはそうではないかもしれませんが、特定の順序で結果を保証するためのドキュメントには何も表示されません。クエリを再調整して、これが当てはまるかどうかを確認することをお勧めします。

于 2012-11-20T09:05:38.037 に答える
1

Orderステートメントを次のように変更します。

.OrderBy(d => d.EndDate.Value.Year).ThenBy(d => d.EndDate.Value.Month)

于 2012-11-20T09:12:05.257 に答える
0

日付の列挙があり、月番号だけを順番に取得したい場合は、次のようにすることができます。

var months = dates
    .Select(d => new { Month = d.Month, Year = d.Year })
    .Distinct()
    .OrderBy(a => 12 * d.Year + d.Month)
    // or .OrderBy(a => a.Year).ThenBy(a => a.Month)
    .Select(a => a.Month);

あなたが年を取り除くDistinctに電話をかけることは、例えば私があなたが望むものであると私が思うところに戻ることを意味することに注意してください。1/1/2011, 5/5/2011, 1/1/20121, 5, 1

このクエリをフィルタリングされた日付のリストに追加するだけです。ただし、現時点で作成している匿名オブジェクトのリストではなく、日付のリストを指定する必要があります。

于 2012-11-20T09:12:46.747 に答える