用计数检索记录的好(优雅)方法
Posted
技术标签:
【中文标题】用计数检索记录的好(优雅)方法【英文标题】:A good(elegant) way to retrieve records with counts 【发布时间】:2011-02-10 06:40:20 【问题描述】:上下文:ASP.NET MVC 2.0、C#、SQL Server 2008、IIS7
我在数据库中有 'scheduledMeetings' 表。 存在一对多关系:scheduledMeeting -> meetingRegistration 这样您就可以有 10 人注册参加会议。 meetingRegistration 具有字段名称和性别(例如)。
我的网站上有一个“日历视图”,显示所有即将发生的事件,以及每个事件的性别统计。
目前我使用 Linq to Sql 拉取数据:
var meetings = db.Meetings.Select(
m => new
MeetingId = m.Id,
Girls = m.Registrations.Count(r => r.Gender == 0),
Boys = m.Registrations.Count(r=>r.Gender == 1)
);
(实际查询是半页长) 因为正在进行匿名类型使用,所以我无法将其提取到方法中(因为我有几种不同风格的日历视图,每种都有不同的信息,我不想为每个视图创建新类)。
关于如何改进这一点有什么建议吗? 难道数据库视图就是答案? 还是我应该继续创建命名类型?
欢迎任何反馈/建议。我的 DataLayer 很大,我想修剪它,就是不知道怎么做。
指向良好阅读的指针也很好。
【问题讨论】:
【参考方案1】:我会通过添加 2 个属性来扩展您的 Meetings
类:
public partial class Meeting
#region Properties
public int BoyCount get; set;
public int GirlCount get; set;
#endregion
延迟加载:
var items = db.Meetings.Select(
m => new
Meeting = m,
Girls = m.Registrations.Count(r => r.Gender == 0),
Boys = m.Registrations.Count(r = >r.Gender == 1)
).ToList();
items.ForEach(i =>
i.Meeting.BoyCount = i.Boys;
i.Meeting.GirlCount = i.Girl;
);
List<Meeting> = items
.Select(i => i.Meeting)
.ToList();
使用即时加载,其中一种解决方案是使用您的 Meeting
实体加载 Registrations
:
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Meeting>(m = > m.Registrations);
db.LoadOptions = loadOptions;
在这种情况下,上面的部分类属性变成了 getter:
public partial class Meeting
#region Properties
public int BoyCount
get
return this.Registrations
.Count(r => r.Gender == 1);
public int GirlCount
get
return this.Registrations
.Count(r = > r.Gender == 0);
#endregion
【讨论】:
以上是关于用计数检索记录的好(优雅)方法的主要内容,如果未能解决你的问题,请参考以下文章
对源数据来自多个来源的 Solr 记录进行索引的好方法是啥?