Linq加入表,按日期分组,值的总和?

时间:2012-11-09 09:15:29

标签: c# linq join group-by sum

我有两张桌子(一对多)。 MeterReadings(0..1) and MeterReadingDetails(*)

我想加入这些表并按日期分组。日期字段位于MeterReadings中,其他字段位于MeterReadingDetails中。

我使用了这段代码:

LINQ的

public static IEnumerable<MeterReadingsForChart> GetCustomerTotal(int CustomerId, int MeterTypeId, DateTime StartDate, DateTime EndDate, MeterReadingsTimeIntervals DateRangeType)
{
    var customerReadings = from m in entity.MeterReadings
        join n in entity.MeterReadingDetails on m.sno equals n.ReadingId
        where m.Meters.CustomerId == CustomerId && m.ReadDate >= StartDate && m.ReadDate <= EndDate && m.Meters.TypeId == MeterTypeId
        group n by new { date = new DateTime(m.ReadDate.Value.Year, m.ReadDate.Value.Month, 1) } into g
        select new MeterReadingsForChart
        {
             ReadDate = g.Key.date,
             Value = g.Sum(x => x.Value),
             Name = g.FirstOrDefault().MeterReadingTypes.TypeName
         };

    return customerReadings;
}

MeterReadinsForChart.cs

public class MeterReadingsForChart
{
    public DateTime ReadDate { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
}

但我收到了这个错误:

  

LINQ to Entities

中仅支持无参数构造函数和初始值设定项

我如何加入,分组和总结?

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

var customerReadings = (from m in entity.MeterReadings
    join n in entity.MeterReadingDetails on m.sno equals n.ReadingId
    where m.Meters.CustomerId == CustomerId && m.ReadDate >= StartDate && m.ReadDate <= EndDate && m.Meters.TypeId == MeterTypeId
    group n by new { Year = m.ReadDate.Value.Year, Month = m.ReadDate.Value.Month} into g
    select new
    {
         Key = g.Key,
         Value = g.Sum(x => x.Value),
         Name = g.FirstOrDefault().MeterReadingTypes.TypeName
     }).AsEnumerable()
       .Select(anon => new MeterReadingsForChart
       {
         ReadDate = new DateTime(anon.Key.Year, anon.Key.Month, 1),
         Value = anon.Value,
         Name = anon.Name
       });

UNF。它的丑陋但实体框架不会让你创建一个DateTime(它是一个没有无参数构造函数的结构)。所以在这种情况下,我们需要db的大部分结果,然后在这个流中我们在内存中构造日期。