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())

这种行为是由于 LinqToObjects groupby 和 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 回答