C# 按日期分组的Linq命令-如何分组

C# 按日期分组的Linq命令-如何分组,c#,linq,C#,Linq,我试图创建一个Iqueryable方法,它返回每天服务的连接数。此数据从SQL Server数据库中读取 这是康涅狄格主义课程 public class ConnectionItem { public DateTime CreatedDate { get; set; } public int NumberOfConnections { get; set; } } 这是我的生日礼物 private IQueryable<ConnectionItem> ListItem

我试图创建一个Iqueryable方法,它返回每天服务的连接数。此数据从SQL Server数据库中读取

这是康涅狄格主义课程

public class ConnectionItem
{
    public DateTime CreatedDate { get; set; }
    public int NumberOfConnections { get; set; }
}
这是我的生日礼物

private IQueryable<ConnectionItem> ListItems(DataContext dataContext)
{
    return dataContext.Connections
        .Join(dataContext.Configurations,
            connections => connections.ConfigID,
            config => config.ConfigID,
            (connections, config) => new { cx = connections, cf = config })
        .Join(dataContext.Users,
            config => config.cf.UserID,
            users => users.UserID,
            (config, users) => new { cf = config, su = users})
            .Where(q => q.su.AccountEventID == 123 && q.cf.cx.Successful == true)
            .GroupBy(g => g.cf.cx.CreatedDate.ToShortDateString())
            .Select(s => new ConnectionItem
            {
                CreatedDate = ????,
                NumberOfConnections = ????
            });
}
private IQueryable列表项(DataContext DataContext)
{
返回dataContext.Connections
.Join(dataContext.Configurations,
connections=>connections.ConfigID,
config=>config.ConfigID,
(connections,config)=>new{cx=connections,cf=config})
.Join(dataContext.Users,
config=>config.cf.UserID,
users=>users.UserID,
(配置,用户)=>new{cf=config,su=users})
.Where(q=>q.su.AccountEventID==123&&q.cf.cx.Successful==true)
.GroupBy(g=>g.cf.cx.CreatedDate.ToShortDateString())
.选择(s=>new ConnectionItem
{
CreatedDate=????,
连接数=????
});
}
如何访问分组日期值和每组的项目数

还有,有没有更简单的方法来写这种陈述?我不能100%确定别名cx、cf等是如何工作的


欢迎任何输入。

.GroupBy
linq方法返回一个
i分组
,它基本上是一个列表,其中包含您刚才分组所依据的
属性

所以这里

Select(s => new ConnectionItem
        {
            CreatedDate = ????,
            NumberOfConnections = ????
        });
您可以迭代一个
IEnumerable
,以便执行此操作

Select(s => new ConnectionItem
        {
            CreatedDate = s.Key
            NumberOfConnections = s.Count()
        });

编辑根据评论,我意识到你在寻找的号码不是实际的列表

只要调用
s.Key
s.Count()
,你就可以得到如下结果:

private IQueryable<ConnectionItem> ListItems(DataContext dataContext)
    {
        return dataContext.Connections
            .Join(dataContext.Configurations,
                connections => connections.ConfigID,
                config => config.ConfigID,
                (connections, config) => new {cx = connections, cf = config})
            .Join(dataContext.Users,
                config => config.cf.UserID,
                users => users.UserID,
                (config, users) => new {cf = config, su = users})
            .Where(q => q.su.AccountEventID == 123 && q.cf.cx.Successful == true)
            .GroupBy(g => g.cf.cx.CreatedDate.ToShortDateString())
            .Select(s => new ConnectionItem
            {
                CreatedDate = s.Key,
                NumberOfConnections = s.Count()
            });
    }
private IQueryable列表项(DataContext DataContext)
{
返回dataContext.Connections
.Join(dataContext.Configurations,
connections=>connections.ConfigID,
config=>config.ConfigID,
(connections,config)=>new{cx=connections,cf=config})
.Join(dataContext.Users,
config=>config.cf.UserID,
users=>users.UserID,
(配置,用户)=>new{cf=config,su=users})
.Where(q=>q.su.AccountEventID==123&&q.cf.cx.Successful==true)
.GroupBy(g=>g.cf.cx.CreatedDate.ToShortDateString())
.选择(s=>new ConnectionItem
{
CreatedDate=s.键,
NumberOfConnections=s.Count()
});
}
group子句返回一个IGROUP序列 包含零个或多个与的键值匹配的项的对象 小组。例如,您可以根据需要对字符串序列进行分组 到每个字符串中的第一个字母。在本例中,第一个字母是 键和具有类型char,并存储在每个 i分组对象。编译器推断出 钥匙


根据
日期时间
对象的
日期
部分进行分组。
Date
属性只是删除时间部分。您正在将日期转换为字符串,因此会丢失DateTime对象的保真度

var eventId = 123;
return dataContext.Connections.Join(dataContext.Configurations,
        conn => conn.ConfigID,
        cfg => cfg.ConfigID,
        (conn, cfg) => new { conn, cfg })
    .Join(dataContext.Users,
        x => x.cfg.UserID,
        u => u.UserID,
        (x, u) => new { x.conn, u })
    .Where(x => x.conn.Successful && x.u.AccountEventID == eventId)
    .GroupBy(x => x.conn.CreatedDate.Date)
    .Select(g => new ConnectionItem
    {
        CreatedDate = g.Key,
        NumberOfConnections = g.Count(),
    });
使用查询语法可以更好地表达上述内容

var eventId = 123;
return
    from conn in dataContext.Connections
    join cfg in dataContext.Configurations on conn.ConfigID equals cfg.ConfigID
    join u in dataContext.Users on cfg.UserID equals u.UserID
    where conn.Successful && u.AccountEventID == eventId
    group 1 by conn.CreatedDate.Date into g
    select new ConnectionItem
    {
        CreatedDate = g.Key,
        NumberOfConnections = g.Count(),
    };

尝试调用
{CreateDate=s.Key,NumberOfConnections=s.Count()}