Solved

How to use Linq group by and sum values from 3 tables

Posted on 2015-01-22
5
208 Views
Last Modified: 2016-02-15
I am know how I'd do this in SQL but am new to Linq and can't figure this one out.

In the database, one Request will have multiple RequestSteps, each RequestStep will have 1 procedure which has the TechHrs attribute
I want to group by Request and Sum up the TechHrs for all the steps
Requests.JPG
If I do this:
var query1 =
	from r in Requests
	from proc in Procedures
	from rs in RequestSteps
	group r by r.RequestNum into rsg
	select new {rsg.First().RequestNum, SUM = rsg.Sum(x => x.TechHrs)};

Open in new window


The x.TechHrs isn't defined

I would think this would work
	select new {rsg.First().RequestNum, SUM = rsg.Sum(x => x.rs.proc.TechHrs) };

Open in new window

But rs isn't defined
0
Comment
Question by:Lab Guy
  • 3
  • 2
5 Comments
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 40564779
Hi Lab Guy;

The issue with this part of the code,

SUM = rsg.Sum(x => x.rs.proc.TechHrs)

is that x represents a data record of Request and TechHrs is not a member of Request. In your model there should be a field which is a collection of RequestStep which needs to be inserted between x and TechHrs. The code snippet below should do what you need. You will need to replace the refToRequestStep with the field name in Request table that is the collection of RequestStep not shown in your model screen shot.

var query1 =
          from r in Requests
          group r by r.RequestNum into rsg
          from req in rsg
          select new
          {
            RequestNum = rsg.First().RequestNum,
            SUM = rsg.refToRequestStep.Sum(x => x.TechHrs)
          };

Open in new window

0
 

Author Comment

by:Lab Guy
ID: 40565030
If I change my select to this
select rsg;

Open in new window

I get this (using LinqPad)
Results from search in LinqPadSo, looks to me like this should work
	select new {
		rsg.First().RequestNum, 
		SUM = rsg.RequestSteps.Procedures.Sum(x => x.TechHrs) 
	};

Open in new window

But get this error:

'System.Linq.IGrouping<string,LINQPad.User.Request>' does not contain a definition for 'RequestSteps' and no extension method 'RequestSteps' accepting a first argument of type 'System.Linq.IGrouping<string,LINQPad.User.Request>' could be found (press F4 to add a using directive or assembly reference)
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 40565271
Sorry I did not realize that the TechHrs field was in the Procedures table. Please try it like this to see if it gives the results you need.

var query1 =
          from r in Requests
          group r by r.RequestNum into rsg
          select new
          {
            RequestNum = rsg.First().RequestNum,
            SUM = (from rr in RequestSteps
                   select rr.RequestSteps.Select( rs => rs.Procedures.TechHrs ).Sum( h => h ))
             )
          }; 

Open in new window

0
 

Author Comment

by:Lab Guy
ID: 40565382
Ok, getting closer, still not recognizing RequestSteps
Linq Results
0
 
LVL 63

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 40565469
Try this and see if it works. If it is not working with this change can you upload the database to the web so I can test with it if is small.

Remove this line from the query.

from req in rsg

And change the last line of the query to this.

TechHrsSUM = (from rr in rsg
              select rr.RequestSteps.Select( rs => rs.Procedures.TechHrs ).Sum( h => h ))
             )

Open in new window

0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question