C# 按日期分组的Linq命令-如何分组
我试图创建一个Iqueryable方法,它返回每天服务的连接数。此数据从SQL Server数据库中读取 这是康涅狄格主义课程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
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()}