質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

LINQで、DateTime型の値から年月だけを取り出し、レコード数を集計したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+

nae_stage

score 69

LINQで以下のことをしたいのですが、うまくいきません。

・指定した1人のユーザについて、年月ごとのログイン回数の表を作りたいです。

年月 回数
2010/08 200回
2010/09 140回
・・・ ・・・

という表です。

・テーブルは以下のようになっています。
SampleTable
Id : long型、Key
User(ユーザ名) : string型
LoginDate : DateTime型

わからないのは、
LINQを使って、
DateTime型で保存されているLoginDateの値から、年月だけを取り出し、
グループ化する方法
です。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんな感じでしょうか?

List<SampleTable> table = GetData();
string targetUser = "USER_AAA";

var grouped = table
    .Where(p => p.User == targetUser)
    .GroupBy(p => p.LoginData.ToString("yyyyMM")); // "201609"という文字列になる
    // 数字がいいなら
    // .GroupBy(p => p.LoginData.Year * 100 + p.LoginData.Month); // 201609という数値になる

補足
DateTimeの書式変換を細かく解説しているサイト

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/09 17:19

    回答ありがとうございます。
    上記の方法を試してみたところ、以下のエラーが出ました。

    >>メソッド 'System.String ToString(System.String)' は LINQ to Entities では認識されないため、ストア式に変換できません。

    ToStringは使えないということでしょうか?

    キャンセル

  • 2016/09/09 17:38 編集

    なるほど、一般的な「LINQ to Objects」 ではなく、「LINQ to Entities」の方でしたか。
    であればDateTimeの書式変換は使えませんね。
    「LINQ to Entities」はいろいろ制約があるので上記の数値による実装が無難かもしれません。(もっとスマートなやり方もあるとは思いますが)

    このあたりを参考にしてみてください(2ページ目には実際に何が出来るかがある程度詳しく説明されています)
    https://codezine.jp/article/detail/8474

    キャンセル

  • 2016/09/09 18:08

    説明が足りず、申し訳ありませんでした。
    Entity相手だからToStringが使えないということなんですね、納得しました。

    先程の回答の数値による実装を見落としていたため、試してみたところ、期待通りの表が完成しました。
    補足のリンクもありがとうございます。

    キャンセル

0

こんな感じでしょうか。
http://ideone.com/couziu

using System;
using System.Collections.Generic;
using System.Linq;

namespace Teratail47399
{
    class Program
    {
        class SampleTable
        {
            public long Id;
            public string User;
            public DateTime LoginDate;
        }

        static void Main(string[] args)
        {
            var list = new List<SampleTable>();

            list.Add(new SampleTable()
            {
                Id = 0,
                User = "user01",
                LoginDate = DateTime.Parse("2016/08/09 13:00")
            });

            list.Add(new SampleTable()
            {
                Id = 1,
                User = "user01",
                LoginDate = DateTime.Parse("2016/09/09 13:00")
            });

            list.Add(new SampleTable()
            {
                Id = 2,
                User = "user01",
                LoginDate = DateTime.Parse("2016/09/10 13:00")
            });

            list.Add(new SampleTable()
            {
                Id = 3,
                User = "user02",
                LoginDate = DateTime.Parse("2016/09/10 13:00")
            });

            foreach (var data in list.Where(x => x.User == "user01").GroupBy(x => x.LoginDate.ToString("yyyy/MM")))
            {
                Console.WriteLine($"{data.Key} {data.Count()}回");
            }
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/09 18:10

    回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る