私はAsp.Net、MVC3、Linq、およびそれに関連する他のすべてに不慣れです。私はPHPとColdFusionに非常に慣れているので、無知を許してください。基本的に、私がやろうとしているのは、cfoutputのグループ属性と同等の機能を実行できるColdFusionでの状況を再現することです。私はストアドプロシージャを呼び出してから実行することに慣れています
<cfoutput group="id">
次に、データが異なる列の別の内部cfoutput。チャームのように機能します!Asp.Netではそれほど多くはありません。
1対多の関係で2つのテーブルから結合を返すストアドプロシージャを引き続き使用したいと思います。たとえば、フルネーム、タイトル、卒業年の3つの列があるとします。卒業年は結合されたテーブルの列であるため、ストアドプロシージャの結果は次のようになります。
ジム教授2005
ジム教授2008
ジム教授2011
これをビューに送信します。次に、列の1つ(おそらくフルネーム)に基づいてデータをグループ化するのがビューの仕事だと思います。3列のHTMLテーブルを出力したいのですが、この状況では1行になります。
ジム教授2005、2008、2011
私はグループキーと呼ばれるこのことを使用するたくさんの例をグーグルで検索しました。1つの値「Jim」(またはグループ化された値)を出力するだけでは興味がないため、これは役に立たないようです。各行に「Jim」と「Professor」の両方の値を出力する必要があります。私の考えでは、2つのforeachループが必要です。外側のループはフルネームとタイトルを表示し、内側のループは卒業年のすべての可能な一致を通過します。特にこのIGrouping構文では、グループで卒業年を取得できないようです。キーは1つの値しか格納できず、その行のすべての値が必要です。実際に繰り返す必要があるのは1つまたは2つの値だけです。セカンダリlinqグループ化を実行した後、カスタムビューモデルを作成して、それを厳密に型指定されたビューに送信する必要がありますか?
編集: わかりました、動作するコードがありますが、基本的にストアドプロシージャから持っているすべての列/値を再定義する必要があるため、非常に非効率的です。ストアドプロシージャを忘れて、すべてにLINQを使用したくなります。私が求めていたのは、一種の「複数の列のグループ」であり、リンクは非常に役立ちました。
var records = db.getRecords();
var groups = from r in records
group r by new
{
r.id
}
into row
select new ListVM()
{
id = row.Key.id,
fullname = row.Select(x => x.fullname).First(),
title = row.Select(x => x.title).First(),
degrees = row.Select(x => x.degree_name).ToList(),
majors = row.Select(x => x.major_name).ToList()
};
return View(groups);
もちろん、これを機能させるにはViewModelを作成する必要がありました。私の見解では、forループを使用して、学位と専攻のリストを反復処理できます。これはこれを行うための最良の方法ですか?通常、情報の行全体を表示するにはグループキー以上のものが必要であり、ほとんどの例でグループキーを1回だけ表示してすべてを繰り返すのではなく、20列の行でリストを1回または2回だけ繰り返します。そうか。