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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

2回答

25137閲覧

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

nae_stage

総合スコア274

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2016/09/09 06:23

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

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

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

という表です。

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

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

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんな感じでしょうか?

c#

1List<SampleTable> table = GetData(); 2string targetUser = "USER_AAA"; 3 4var grouped = table 5 .Where(p => p.User == targetUser) 6 .GroupBy(p => p.LoginData.ToString("yyyyMM")); // "201609"という文字列になる 7 // 数字がいいなら 8 // .GroupBy(p => p.LoginData.Year * 100 + p.LoginData.Month); // 201609という数値になる

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

投稿2016/09/09 06:52

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nae_stage

2016/09/09 08:19

回答ありがとうございます。 上記の方法を試してみたところ、以下のエラーが出ました。 >>メソッド 'System.String ToString(System.String)' は LINQ to Entities では認識されないため、ストア式に変換できません。 ToStringは使えないということでしょうか?
ishi9

2016/09/09 08:42 編集

なるほど、一般的な「LINQ to Objects」 ではなく、「LINQ to Entities」の方でしたか。 であればDateTimeの書式変換は使えませんね。 「LINQ to Entities」はいろいろ制約があるので上記の数値による実装が無難かもしれません。(もっとスマートなやり方もあるとは思いますが) このあたりを参考にしてみてください(2ページ目には実際に何が出来るかがある程度詳しく説明されています) https://codezine.jp/article/detail/8474
nae_stage

2016/09/09 09:08

説明が足りず、申し訳ありませんでした。 Entity相手だからToStringが使えないということなんですね、納得しました。 先程の回答の数値による実装を見落としていたため、試してみたところ、期待通りの表が完成しました。 補足のリンクもありがとうございます。
guest

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 06:47

編集2016/09/09 06:48
aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nae_stage

2016/09/09 09:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問