3

i have nearly 1 million data, which i definitely don't want to query all of them to memory and then group them, so i tried this, but linq2Entity does not recognize string.join(), IEnumerable.toList(), or same things

                var capaHrs = (
                from newsPerHr in _dbRawDataContext.CapacityPerHours
                where newsPerHr.StreamDT >= this.BeginDateTime
                                && newsPerHr.StreamDT < this.EndDateTime
                                && newsPerHr.ServerName == this.ServerName
                group newsPerHr by newsPerHr.StreamDT into grp
                let MsgSizeTotal = (from i in grp select i.MsgSize).Sum(x => (int)x)
                let MNumber = (from i in grp select i.MsgNumber).Sum(x => (int)x)
                let Feeds = (from i in grp select i.FeedName).ToArray()
                select new 
                {
                    ServerName = ServerName,
                    FeedName = Feeds,
                    StreamDT = grp.Key,
                    MsgSize = MsgSizeTotal,
                    MsgNumber = MNumber
                }).ToList();

            _capacityData = capaHrs.Select(x => new CapacityPerHour {
                ServerName = x.ServerName,
                FeedName = string.Join(", ",x.FeedName),
                StreamDT = x.StreamDT,
                MsgSize = x.MsgSize,
                MsgNumber = x.MsgNumber
            }).ToList();

how to make it work?

Scott 混合理论
  • 2,263
  • 8
  • 34
  • 59

1 Answers1

2

It only needed a couple of changes:

  1. Removed the ToArray in the Feeds declaration
  2. Grouped by an anonymous type so you can include multiple properties, ServerName and StreamDT

Give this a try:

var capaHrs = (
                from newsPerHr in _dbRawDataContext.CapacityPerHours
                where newsPerHr.StreamDT >= this.BeginDateTime
                                && newsPerHr.StreamDT < this.EndDateTime
                                && newsPerHr.ServerName == this.ServerName
                group newsPerHr by new { newsPerHr.ServerName, newsPerHr.StreamDT } into grp
                let MsgSizeTotal = grp.Sum(x => (int)x.MsgSize)
                let MNumber = grp.Sum(x => (int)x.MsgNumber)
                let Feeds = (from i in grp select i.FeedName)
                select new 
                {
                    ServerName = grp.Key.ServerName,
                    FeedName = Feeds,
                    StreamDT = grp.Key.StreamDT,
                    MsgSize = MsgSizeTotal,
                    MsgNumber = MNumber
                }).ToList();

_capacityData = capaHrs.Select(x => new CapacityPerHour {
                ServerName = x.ServerName,
                FeedName = string.Join(", ",x.FeedName),
                StreamDT = x.StreamDT,
                MsgSize = x.MsgSize,
                MsgNumber = x.MsgNumber
            }).ToList();
Aducci
  • 26,101
  • 8
  • 63
  • 67