I have the following SQL statement:
select
p.productId,
p.minAge,
p.maxAge,
min(pcb.lowerbound) MinValue,
max(pcb.upperBound) MaxValue,
p.name ProductName
from gliweb..product p
inner join gliweb..ProductClassBand pcb on pcb.productId = p.productId
where p.IncludeInQuote = 1
and @currentAge between p.minAge and p.maxAge
group by p.productId, p.minAge, p.maxAge, p.name
order by p.name
As you can see, it is a simple statement with a GROUP and then a MIN/MAX. I am trying to convert this query into C# LINQ and I am having a hard time.
Thus far, I have the following:
var productListDatabase = from products in DataContext.Products
join band in DataContext.ProductClassBands on products.productId equals band.productId
where products.minAge <= currentAge &&
products.maxAge >= currentAge &&
products.IncludeInQuote == true
orderby products.name
group products by new{
products.productId,
products.minAge ,
products.maxAge,
products.name
} into g
select new
{
g.Key.maxAge,
g.Key.minAge,
g.Key.productId,
g.Key.name
//,minFace = (from t2 in band select t2.
};
It does everything that I need except for the MIN/MAX face columns. I am unsure how to do this because I am join
ing one table but need to aggregate the data from another table.
Can anyone help me finish this query as a Linq statement?
First off, you need to use group join
Group Join
A join clause with an into expression is called a group join.
A group join produces a hierarchical result sequence, which associates elements in the left source sequence with one or more matching elements in the right side source sequence. A group join has no equivalent in relational terms; it is essentially a sequence of object arrays.
Here is the query
var productListDatabase = from product in DataContext.Products
join band in DataContext.ProductClassBands on product.productId equals band.productId into productBands
where product.minAge <= currentAge &&
product.maxAge >= currentAge &&
product.IncludeInQuote == true
group new { product, productBands } by new {
product.productId,
product.minAge ,
product.maxAge,
product.name
} into g
orderby g.Key.name
select new
{
g.Key.maxAge,
g.Key.minAge,
g.Key.productId,
g.Key.name,
minFace = g.SelectMany(e => e.productBands).Min(band => band.lowerbound),
maxFace = g.SelectMany(e => e.productBands).Max(band => band.upperBound)
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With