【问题标题】:How do you JOIN/GROUP/Max/Min all within Linq?你如何在 Linq 中加入/组/最大/最小?
【发布时间】:2016-01-13 19:36:07
【问题描述】:

我有以下 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 面列之外,它可以满足我的所有需求。我不确定如何执行此操作,因为我正在 joining 一个表,但需要聚合另一个表中的数据。

谁能帮我完成这个查询作为一个 Linq 语句?

【问题讨论】:

标签: c# linq linq-to-sql


【解决方案1】:

首先,你需要使用group join

加入群组

带有 into 表达式的 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)
    };

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2017-09-04
    相关资源
    最近更新 更多