在linq中使用let运算符作为Intervals

时间:2012-02-06 10:57:25

标签: c# linq entity-framework linq-to-sql linq-to-entities

请考虑此图片:

enter image description here

我有一张这样的表:

 Age              Active            Men/Women
 -------------------------------------------------

我想用linq写一个查询给男性和女性每个年龄段Count的实体。我可以使用let运算符来计算单行,但我想在一个查询中计算所有。

感谢

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我不认为这在Linq2Sql中是可行的,但我提出了这个查询:

Func<int, string> ageGroup = age => string.Format("Age {0}-{1}", (age / 5) * 5, ((age / 5) * 5) + 4);
var blub = from row in table.AsEnumerable()
           where row.IsActive == 1
           group row by ageGroup(row.age)
           into grouped
           from g in grouped
           let menCount = g.Aggregate(0, (sum, r) => sum + r.men)
           let womenCount = g.Aggregate(0, (sum, r) => sum + r.women)
           let totalCount = menCount + womenCount
           select new { AgeGroup = g.Key, Men = menCount, Women = womenCount, Total = totalCount}

首先,我定义一个函数来返回给定年龄的AgeGroup((age / 5) * 5给出AgeGroup的起始编号)。从那里它非常简单。对年龄进行分组并将数字相加。

修改
我认为在一个查询中不可能。由于group by结束了查询(例如select),您需要先进行分组再添加 您不能使用IQueryable,因为SQL中不知道ageGroup()函数,因此无法在Linq2Sql中使用。