您如何在Linq中全部加入/组/最大/最小?

Hol*_*olt 1 c# linq linq-to-sql

我有以下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
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个简单的语句,其中包含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.
    };
Run Code Online (Sandbox Code Playgroud)

除了MIN / MAX面列,它可以完成我需要的所有操作。我不确定如何执行此操作,因为我正在join一张桌子上,但是需要聚合来自另一张桌子的数据。

谁能帮助我以Linq语句完成此查询?

Iva*_*oev 5

首先,您需要使用群组加入

团体加入

加入子句与表达式称为组加入。

组联接产生分层结果序列,该结果序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。团体联接在关系方面没有等效项;它本质上是一个对象数组序列。

这是查询

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)
    };
Run Code Online (Sandbox Code Playgroud)