C#のLINQに関する質問です。
DBのデータの集計で、文字列の集計方法がわかりません。
クエリ式での集計方法を模索中で、teratailユーザーさんにご助力願いたいと思います。
自分で調べて目指す処理をSQLで実現する例を見つけたものの、LINQ初心者でLINQにうまく落とし込めない状態です。
作成中の画面:2画面
- 横2列の一覧画面(以下:【地方一覧画面】)
・左列:日本の地方名(東北、四国など)
・右列:URLつきの「詳細」
- 横3列の各地方の詳細情報画面(以下:【詳細画面】)
・左列:その地方の都道府県名
・中列:その地方の県庁所在地
・右列:その地方の名産品
現状の問題点、実現イメージ、前提条件
- 現状の問題点
・DBでは名産品を1行1つしか取得できないため、同じ自治体の情報が何列にもなってしまう
- 修正イメージ
・DBに同じ都道府県の詳細情報が格納されている場合、読点「、」で区切る
・同じ都道府県を一列でまとめたい(上図の右下「完成イメージ」参照)
・可能な限りメソッド式を使わず、クエリ式で記述したい
- 前提条件
・(当たり前ですが)都道府県と県庁所在地は一意
・詳細画面のあと、「戻る」ボタンで地方一覧画面に戻ります
・今回の質問は、データベースから取得した文字列の集計です
開発環境
・windows10(2016)
・IIS ver10.0
・Visual Studio 2019
・SQL Server 2016
・.NET Framework ver4.5
・ASP.NET MVC ver5.2.7
・Chrome(最新)
・言語:C#
コード
今回の投稿に必要そうな箇所のみ抜き出しています。
現状でエラーなく画面操作はできている状態です。
ファイル名:ChubuViewModel.cs
C#
1namespace Chubu.ViewModel 2{ 3 public class ChubuViewModel 4 { 5 // メインは詳細画面のため、地方一覧画面に関する記述は省略 6 7 public List<ChubuInfoRow> Items {get; set;} 8 9 public class ChubuInfoRow 10 { 11 [DisplayName"都道府県"] 12 public string TdfkName {get; set;} 13 14 [DisplayName"県庁所在地"] 15 public string KenchoName {get; set;} 16 17 [DisplayName"県の名産品"] 18 public string MeisanName {get; set;} 19 } 20 } 21}
ファイル名:ChubuModel.cs
(ViewModelはUsing済)
C#
1namespace Chubu.Models 2{ 3 public class ChubuModel 4 { 5 public ChubuViewModel = GetChubuViewModel(string tdfkId) 6 { 7 ChubuViewModel model = new ChubuViewModel(); 8 9 using (DataBase db = new Database()) 10 { 11 var tdfkNo = "004"; // 中部地方。「地方一覧画面」の北海道が"001"のイメージ。 12 // 「地方一覧画面」から地方ごとのコードを取得するコードが未実装のため、中部地方を仮置きしています。 13 14 // 「地方一覧画面」左列(日本の地方名)を取得 15 var x = from a in db.Areas 16 where a.tdfk_cd = tdfkNo 17 select new ChubuViewModel 18 { 19 AreaName = a.area_nm 20 }; 21 22 // 「詳細画面」のテーブルを取得 23 var y = from a in db.Areas 24 where a.tdfk_cd = tdfkNo 25 join b in db.TdfkInfos on a.tdfk_cd equals b.tdfk_cd 26 join c in db.TdfkDetailInfos 27 on new {a.tdfk_cd, b.register_no} equals new {c.tdfk_cd, c.register_no} 28 join d in db.Meisanhins on a.meisan_nm equals meisan_nm 29 30 select new ChubuViewModel.ChubuInfoRow 31 { 32 TdfkName = b.tdfk_nm, 33 KenchoName = b.kencho_nm, 34 MeisanName = d.meisan_nm, 35 }; 36 37 // このあとItemsにyを入れる記述がありますが、ここでは省略。 38 39 } 40 } 41 } 42}
DBのイメージ
・Areas:日本の地方の情報を格納
・TdfkInfos:都道府県の情報を格納
・TdfkDetailInfos:都道府県の詳細情報(県庁の住所など)を格納
・Meisanhins:都道府県の名産品情報を格納
以上です。
長い説明かつ抽象的な記述のみで申し訳ありませんが、ご回答いただければと思います。
よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー