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?

1 Answer 1

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();
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.