🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

1961閲覧

ASP.NET Coreにおいて、ViewModel内でGroupByを使った際の返し方

K-actus

総合スコア22

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/12/07 08:23

編集2020/12/07 08:27

こんにちは。
ASP.NET Coreについて初学者なので拙いところもあると思いますが、よろしくお願いします。

実現したいこと

ASP.NET Coreにおいて、複数のModelをまとめるViewModel内の1つのModelに対してGroupByを使った際、Viewへの返し方がわかりません。

実現したいことは、AListと、BListをGroupByしたもの、2つのModelをViewModelとして1つのViewに表示させることです。

ソースコード

以下ViewModelのModelとControllerです。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5 6 7namespace SampleProject.Models 8{ 9 public class SampleViewModel 10 11 { 12 public IEnumerable<AList> ALists { get; set; } 13 public IEnumerable<BList> BLists { get; set; } 14 } 15} 16

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using Microsoft.AspNetCore.Mvc; 6using Microsoft.EntityFrameworkCore; 7using SampleProject.Data; 8using SampleProject.Models; 9 10namespace SampleProject.Controllers 11{ 12 public class SampleViewModelsController : Controller 13 { 14 15 private readonly MyDbContext _context; 16 17 public SampleViewModelsController(MyDbContext context) 18 { 19 _context = context; 20 } 21 22 public async Task<IActionResult> Index() 23 { 24 SampleViewModel myView = new SampleViewModel(); 25 myView.ALists = await _context.ALists.ToListAsync(); 26 myView.BLists = await _context.BLists.GroupBy(x => x.Kind).ToListAsync(); 27//型 'System.Collections.Generic.List<System.Linq.IGrouping<string, SampleProject.Models.BList>>' を 'System.Collections.Generic.IEnumerable<SampleProject.Models.BList>' に暗黙的に変換できません。明示的な変換が存在します (キャストが不足していないかどうかを確認してください) 28 29 return View(myView); 30 } 31 } 32} 33

わからないこと

View側でGroup化されたデータをforeachで処理したいので、
SampleViewModelのView側1行目にあるModelのImport部分も

@model DBAccessSample.Models.SampleViewModel

ではなく

@model IEnumerable<IGrouping <string,SampleProject.Models.SampleViewModel>>

にするべきなのでしょうが、AListが含まれているせいで

IGrouping<string, SampleViewModel>' に 'ALists' の定義が含まれておらず、型 'IGrouping<string, SampleViewModel>' の最初の引数を受け付けるアクセス可能な拡張メソッド 'ALists' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないかを確認してください。

というエラーが出ます。

エラー文からControllerで型変換するべきなのは理解していますが、その際にやりたい処理を実現できるのか、またView側でどう受け取ればいいのかについてがわかりません。

よろしくお願いします。

補足情報

Visual Studio 2017 Community
Microsoft.AspNetCore.All 2.2.8
Windows10 Pro 1909

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

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

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

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

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

guest

回答1

0

ベストアンサー

myView.BLists = await _context.BLists.GroupBy(x => x.Kind).ToListAsync();

それでエラーになりませんか? 前のスレッドのやり取りを見てない?

【2020/12/8 9:40 追記】

コンパイルエラーだったんですね。見落としてました。

型 'System.Collections.Generic.List<System.Linq.IGrouping<string, SampleProject.Models.BList>>' を 'System.Collections.Generic.IEnumerable<SampleProject.Models.BList>' に暗黙的に変換できません。明示的な変換が存在します (キャストが不足していないかどうかを確認してください)

そのエラーは、エラーメッセージが言うように SampleViewModel クラスの BLists プロパティの型 IEnumerable<BList> を System.Collections.Generic.List<System.Linq.IGrouping<string, SampleProject.Models.BList>> に変更すれば出なくなります。

それでコンパイルは通るはずですが、相手が SQL Server でしょうから、今度は実行時に _context.BLists.GroupBy(x => x.Kind) のところでそれを SQL Server に発行するための SQL 文に変換できないということで、"Client side GroupBy is not supported" というエラーになると思います。

最初に回答したのはそのことを言ってます。解決策は前のスレッド https://teratail.com/questions/307318 を見てください。

SampleViewModelのView側1行目にあるModelのImport部分も

@model DBAccessSample.Models.SampleViewModel

ではなく

@model IEnumerable<IGrouping <string,SampleProject.Models.SampleViewModel>>

にするべきなのでしょうが

そこは、

実現したいことは、AListと、BListをGroupByしたもの、2つのModelをViewModelとして1つのViewに表示させることです。

という目的を果たすためにはそのままにしておかないとダメです。View の中で、controller から受け取った SampleViewModel の ALists, BLists プロパティで「AListと、BListをGroupByしたもの」を取得して表示するということになります。

投稿2020/12/07 10:30

編集2020/12/08 00:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

K-actus

2020/12/08 02:51

そのままにしておく、というのは @model DBAccessSample.Models.SampleViewModel のままということで大丈夫ですか?
退会済みユーザー

退会済みユーザー

2020/12/08 04:03 編集

そうです > AListと、BListをGroupByしたもの、2つのModelをViewModelとして1つのViewに表示させることです。 View では Model.AList で前者すなわち List<AList> 型のオブジェクトを、Model.BList で後者すなわち List<IGrouping<string, BList>> 型のオブジェクトを取得できるので、後はそれをどのように表示するかを考えてコードを書くだけの問題です。
K-actus

2020/12/08 05:30

"Client side GroupBy is not supported"というエラーは何故か出ませんでしたがやりたかったことは実現できました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/12/08 05:59

Core 3.0 からエラーになるようです。以下の記事の一番最初のトピックを見てください。 質問者さんの場合は Core 2.2 だそうですのでエラーにならなかったということだと思います。3.x にアップグレードすることがあるなら、今から対応しておくのがよさそうです。 Breaking changes included in EF Core 3.x https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/breaking-changes
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問