我有一个朋友正在使用c# Linq来报告下表: varchar(50) namedatetime when 客户希望选择要汇总的列,例如今年的总计,去年的总计,两周前的总计等.每列将有一些开始和结束时间,他们用计数汇总
varchar(50) name datetime when
客户希望选择要汇总的列,例如今年的总计,去年的总计,两周前的总计等.每列将有一些开始和结束时间,他们用计数汇总.我为他做了一个快速选择声明:
select A.name as [Name], (select count(*) from mytable B where A.name = B.name and datepart(yy, when) = datepart(yy,getdate())) as [This Year], (select count(*) from mytable B where A.name = B.name and datepart(yy, when) = (datepart(yy,getdate()) - 1)) as [Last Year] from (select distinct name from mytable) A
我还建议他将每个计算字段设为一个委托,这样他就可以在查询之外包含计算混乱.假设每个委托都有一个开始和结束日期,计算每个不同名称的命中数,那么任何人都想要了解Linq c#代码的样子?
这是一个通用方法,可以与任何表和日期字段一起使用,并返回可以计数的组.对于您想要数据的每个日期范围,您必须多次运行它.static IQueryable<IGrouping<TKey, TSource>> GroupWithinDates<TSource, TKey>( this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, DateTime>> dateSelector, DateTime startDate, DateTime endDate ) { return source .Where(item => dateSelector(item) >= startDate && dateSelector(item) < endDate) .GroupBy(keySelector) } // Usage after setting startDate and endDate var groups = mytable.GroupWithinDates( A => A.name, A => A.when, startDate, endDate) // You can then transform to Name and Count var groupCounts = groups.Select(g => new {Name = g.Key, Count = g.Count()};