0

これが私のシナリオです。寄付者の提供レベルまたは単にそのソート名でグループ化するページを表示しているユーザーに応じて、寄付者を一覧表示するページが必要です。私を投げかけているひねりは、私たちが匿名ドナーをグループ化し、グループ化に基づいてカウントを与えたいということです。

私のコントローラーには

 [HttpGet]
        public ActionResult Society(string id)
        {
            var society = _db.ONLINEDR_DONOR_LIST
                .Include("ONLINEDR_DONORS")
                .Single(s => s.DONOR_LIST_ID == id);

            var donors = _db.ONLINEDR_DONORS
                .Where(d => d.DONOR_LIST_ID == id)
                .OrderBy(d => d.SUBGROUP_SORT)
                .ThenBy(d => d.SORT_NAME)
                .ToList();
            if (User.Identity.Name == "public")
            {
                //First off, check to make sure the list is viewable.
                if (society.PUBLIC_IND == "N")
                    RedirectToAction("Index", "Home");
                donors = _db.ONLINEDR_DONORS
                    .Where(d => d.DONOR_LIST_ID == id)
                    .OrderBy(d => d.SORT_NAME)
                    .ToList();
            }
            var viewModel = new SocietyDetailViewModel()
            {
                Society = society,
                Donors = donors
            };

            return View(viewModel);
        }

のようなものが欲しいのですが

donors = _db.ONLINEDR_DONORS
     .Where(d => d.DONOR_LIST_ID == id)
     .GroupBy(d => d.SORT_NAME)
     .ToList();

これを自分のビューに渡して、どういうわけかビューに表示することができます

<% if (Model.donor.GroupedByItemCount > 1) { %>
<%: Model.donor.GroupedByItemCount %>
<% } %

(私はまだasp.net MVCとLINQに慣れていないので、私が間違っていることを説明するための役立つ参考資料もいただければ幸いです)。

本当にありがとう。

4

1 に答える 1

0

変数の宣言でdonors、コンパイラは次のタイプを決定できdonorsます。List<Donor>

目的のコード内の割り当てでは、ドナーはList<IGrouping<string, Donor>>

donors同時に両方のタイプにすることはできません。


次のクエリがあるとします。

List<IGrouping<string, Donor>> donors = _db.ONLINEDR_DONORS
  .Where(d => d.DONOR_LIST_ID == id)
  .GroupBy(d => d.SORT_NAME)
  .ToList(); 

このクエリはローカルであり、キーを提供します。

donors.Select(g => g.Key)

このクエリは混合モードです。リスト内の各アイテムのクエリがデータベースに送信され、そのカウントが取得されます。これは潜在的なパフォーマンスの問題です。

donors.Select(g => g.Count())

この動作は、LinqToObjectsgroupbyとsqlのgroupbyの違いによるものです。

  • sqlのgroupbyでは、キーと集計を取得します。要素はありません。
  • LinqToObjectsでは、グループのキーと要素を取得し、要素から集計を計算できます。

次のクエリがあるとします。

List<IGrouping<string, Donor>> donors = _db.ONLINEDR_DONORS
  .Where(d => d.DONOR_LIST_ID == id)
  .ToList()
  .GroupBy(d => d.SORT_NAME)
  .ToList();

上記のクエリでは、レコードは最初にハイドレイトされ、次にローカルでグループ化されます。結果に対するすべてのクエリはローカルです。

このクエリは、からの結果データを整形しIGrouping<string, Donor>ますGroupShapeGroupShapeは、SortNameプロパティとCountプロパティを持つクラスです。

donors.Select(g => new GroupShape()
{
  SortName = g.Key,
  Count = g.Count()
});

次のクエリがあるとします。

List<GroupShape> donors = _db.ONLINEDR_DONORS 
  .Where(d => d.DONOR_LIST_ID == id) 
  .GroupBy(d => d.SORT_NAME) 
  .Select(g => new {SortName = g.Key, Count = g.Count()})
  .ToList()
  .Select(x => new GroupShape()
  {
    SortName = x.SortName,
    Count = x.Count
  }).ToList();

ここでは、グループ化とカウントはデータベースで行われます。各行は、最初に匿名インスタンスにハイドレイトされ、次にGroupShape(構成するクラス)のインスタンスにコピーされます。

于 2010-08-05T14:41:39.620 に答える