你如何在Linq内加入/ GROUP / Max / Min?

时间:2016-01-13 19:36:07

标签: 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

正如您所看到的,它是一个简单的语句,带有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声明吗?

1 个答案:

答案 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)
    };