如何根据asp.net mvc中的角色动态分组列表

时间:2010-08-05 14:03:18

标签: linq asp.net-mvc-2 devart

以下是我的情景:我们希望有一个列出捐赠者的页面,具体取决于用户查看我们希望按捐赠者的捐赠级别分组的页面,或者只是他们的分类名称。抛弃我的是我们希望将自愿捐赠者分组并根据分组进行计数。

在我的控制器中我有

 [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的新手,所以任何有用的参考资料都可以解释我做错了什么。)

非常感谢。

1 个答案:

答案 0 :(得分: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中,你得到了密钥和聚合 - 没有elemeents。
  • 在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(你组成的一个类)的实例中。