以下是我的情景:我们希望有一个列出捐赠者的页面,具体取决于用户查看我们希望按捐赠者的捐赠级别分组的页面,或者只是他们的分类名称。抛弃我的是我们希望将自愿捐赠者分组并根据分组进行计数。
在我的控制器中我有
[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的新手,所以任何有用的参考资料都可以解释我做错了什么。)
非常感谢。
答案 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之间的区别。
假设您有此查询:
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>
整形为GroupShape
。 GroupShape
是您组成的具有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
(你组成的一个类)的实例中。