2016-01-13 49 views
1

我有以下SQL語句:你如何加入Linq的JOIN/GROUP/Max/Min?

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 

正如你可以看到,這是一個簡單的語句組,然後一個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. 
    }; 

它確實是我需要的,除了最小/最大臉上列的一切。我不確定如何做到這一點,因爲我是join ing一個表,但需要從另一個表中彙總數據。

任何人都可以幫我完成這個查詢作爲Linq聲明嗎?

+0

[如何執行分組聯接(https://msdn.microsoft.com/en-us/library/bb397905.aspx) –

回答

3

首先,你需要使用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) 
    }; 
+0

完美。感謝您的答案和解釋人! – Holt