Solved

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

Posted on 2015-01-22
5
204 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 62

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 62

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 62

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

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

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

Suggested Solutions

Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

777 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