1

Linq を日付でグループ化し、テキストで表示したい

ここに私のコードがあります

var groups = _uow.Orders.GetAll()
            .Where(x => x.Created > baselineDate)
            .GroupBy(x => x.Created.ToString("yyyy-MM-dd"));

var orders = new
        {
            Day = groups.Select(g => g.Key).ToArray(),
            Total = groups.Select(g => g.Sum(t => t.Total)).ToArray(),
        };

結果は(グラフのラベルに入れるのは良くありません)

 {"Day": [2, 3, 4, 5], "Total": [9999.00, 9999.00, 9999.00, 9999.00] }

でもこれが欲しい (マンスリー)

"Day": ['Jan', Feb', 'Mar', 'Apr'], "Total": [9999.00, 9999.00, 9999.00, 9999.00] }

または毎日

"Day": ['Jan 1', 'Jan 2', 'Jan 3', 'Jan 4'], "Total": [9999.00, 9999.00, 9999.00, 9999.00] }

私が遊ぶことができる DateTime.ToString() について私にアドバイスしてください。

皆さん、ありがとうございました。

4

3 に答える 3

4

助けてくれてありがとう。私は答えを見つけました。

追加

.AsEnumerable()

 .GroupBy(x => x.Created.ToString("MMM d"));

ここに完全なコードがあります

var groups = _uow.Orders.GetAll()
            .Where(x => x.Created > baselineDate)
            .AsEnumerable()
            .GroupBy(x => x.Created.ToString("MMM d"));

        var orders = new
        {
            Day = groups.Select(g => g.Key).ToArray(),
            Total = groups.Select(g => g.Sum(t => t.Total)).ToArray(),
        };
于 2013-07-05T15:51:24.777 に答える
2

この質問では、日時を月の文字列名に変換する方法について説明します。

編集: EF の場合、文字列ロジックを実行する前に、すべてをメモリにプルする必要があります。

var orders = _uow.Orders.GetAll()
    .Where(x => x.Created > baselineDate)
    // pull into memory here, since we won't be making the result set any smaller and
    // we want to use DateTime.ToString(), which EF won't compile to SQL
    .AsEnumerable()
    // this will group by the whole date. If you only want to group by part of the date,
    // (e. g. day or day, month), you could group by x => x.Date.Month or the like
    .GroupBy(x => x.Date)
    .Select(g => new {
        // or use just "MMM" for just the month
        Dates = g.Select(g => g.Key.ToString("MMM d")).ToArray(),
        Total = ...
    });
于 2013-07-04T18:46:51.987 に答える
0

など、EF が理解して SQL に変換できる関数を使用する必要がありますEntityFunctions.TruncateTime。更新されたコードは次のとおりです。

var groups = _uow.Orders.GetAll()
            .Where(x => x.Created > baselineDate)
            .GroupBy(x => EntityFunctions.TruncateTime(x.Created));

次に、出力で文字列の書式設定を使用しますが、Linq-to-Objects に切り替えるために使用して、値が .Net に返された後にそれを行っていることを確認してください。AsEnumerable

var orders = new
        {
            Day = groups.Select(g => g.Key)
                        .AsEnumerable()
                        .Select(x => x.ToString("MMM d"))
                        .ToArray(),
            Total = groups.Select(g => g.Sum(t => t.Total)).ToArray(),
        };
于 2013-07-04T19:42:06.017 に答える