加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:26:36 所属栏目:百科 来源:网络整理
导读:我有一个朋友正在使用c# Linq来报告下表: varchar(50) namedatetime when 客户希望选择要汇总的列,例如今年的总计,去年的总计,两周前的总计等.每列将有一些开始和结束时间,他们用计数汇总.我为他做了一个快速选择声明: select A.name as [Name],(select co
我有一个朋友正在使用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,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()};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读