我有以下SQL语句:
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
正如您所看到的,它是一个简单的语句,带有GROUP,然后是MIN / MAX。我试图将此查询转换为C#LINQ,我很难。
到目前为止,我有以下内容:
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.
};
除MIN / MAX面部列外,它可以完成我需要的所有操作。我不确定如何做到这一点因为我join
一个表但需要聚合来自另一个表的数据。
有人可以帮我完成这个查询作为Linq声明吗?
答案 0 :(得分:4)
首先,您需要使用group join
群组加入
带到表达式的加入子句称为群组加入。
组连接生成分层结果序列,该序列将左源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。小组加入在关系方面没有对应关系;它本质上是一个对象数组序列。
这是查询
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)
};