用计数检索记录的好(优雅)方法

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

【讨论】:

以上是关于用计数检索记录的好(优雅)方法的主要内容,如果未能解决你的问题,请参考以下文章

有没有用 GNU readline 处理多行输入的好方法?

对源数据来自多个来源的 Solr 记录进行索引的好方法是啥?

Python 中更优雅的日志记录方案

如何在 hbase 表中获取计数记录?查询记录的最快方法是啥?

(转)如何优雅的在 Microsoft word中插入代码

创建一个用其他表的记录计数填充的表