当前位置 : 主页 > 编程语言 > c++ >

C#Linq问题:如何识别和计算集合中的项目

来源:互联网 收集:自由互联 发布时间:2021-06-23
我有一个朋友正在使用c# Linq来报告下表: varchar(50) namedatetime when 客户希望选择要汇总的列,例如今年的总计,去年的总计,两周前的总计等.每列将有一些开始和结束时间,他们用计数汇总
我有一个朋友正在使用c# Linq来报告下表:

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()};
网友评论