【问题标题】:Entity Framework lambda query with groupby, sum and average具有 groupby、sum 和 average 的实体框架 lambda 查询
【发布时间】:2012-01-25 03:26:39
【问题描述】:

我有一个名为StockDetails 的实体使用实体框架,见下图

我想获取一个列表IEnumerable<StockDetail>,由ReelsQtytonDays(日期时间)的平均日期和其余属性分组。

我正在使用实体框架作为 ORM 构建数据层(WCF 服务),其中一些服务是旧的 SQL 查询,我正在尝试将其转换为 linq/lamdba 表达式。但我对如何写作还很陌生,需要一些帮助。

这就是我在 lambda 中开始查询的方式,但我卡在了 groupby/sum/average 部分。

public IEnumerable<StockDetail> ListStockDetailByCustomerNumber(int customerNumber)
{
   var CustNo = customerNumber.ToString();

   return _entities.StockDetails
                .Where(x => x.Custno == CustNo)
                .GroupBy(
                    x =>
                    new
                        {
                            x.Millcd,
                            x.Matercd,
                            x.Proddesc,
                            x.Grammage,
                            x.Reelwidth,
                            x.Ordercode,
                            x.Buyordno,
                            x.Whsedesc,
                            x.Co,
                            x.Finished,
                            x.Pm,
                            x.PurchaseOrder,
                            x.Diameter,
                            x.Rtadate,
                            x.Custno,
                            x.Reels,
                            x.Days,
                            x.Qtyton
                        })
                .ToList();

        }

问题已解决:

public IEnumerable<StockDetail> ListStockDetailByCustomerNumber(int customerNumber)
        {
            var stockDetailsList = new List<StockDetail>();
            var custNo = customerNumber.ToString();

            var list = _entities.StockDetails
                       .Where(x => x.Custno == custNo )
                       .GroupBy(
                           x =>
                           new
                               {
                                   x.Millcd,
                                   x.Matercd,
                                   x.Proddesc,
                                   x.Grammage,
                                   x.Reelwidth,
                                   x.Ordercode,
                                   x.Buyordno,
                                   x.Whsedesc,
                                   x.Co,
                                   x.Finished,
                                   x.Pm,
                                   x.PurchaseOrder,
                                   x.Diameter,
                                   x.Rtadate,
                                   x.Custno,
                                   x.UpdDte
                               })
                       .Select(x => new
                                        {
                                            x.Key.Millcd,
                                            x.Key.Matercd,
                                            x.Key.Proddesc,
                                            x.Key.Grammage,
                                            x.Key.Reelwidth,
                                            x.Key.Ordercode,
                                            x.Key.Buyordno,
                                            Reels = x.Sum(p => p.Reels),
                                            Qtyton = x.Sum(p => p.Qtyton),
                                            Day = x.Max(p => p.Days),
                                            //Day = x.Average(p => p.Days.Ticks), // Want to calculate average datetime of date but linq dosn't support datetime.ticks
                                            x.Key.Whsedesc,
                                            x.Key.Co,
                                            x.Key.Finished,
                                            x.Key.Pm,
                                            x.Key.PurchaseOrder,
                                            x.Key.Diameter,
                                            x.Key.Rtadate,
                                            x.Key.Custno,
                                            x.Key.UpdDte
                                        });


            foreach (var s in list)
            {
                stockDetailsList.Add(new StockDetail
                                         {
                                             Millcd  = GetFriendlyNameForKey(s.Millcd),
                                             Matercd = s.Matercd,
                                             Proddesc = s.Proddesc,
                                             Grammage = s.Grammage,
                                             Reelwidth = s.Reelwidth,
                                             Ordercode = s.Ordercode,
                                             Buyordno = s.Buyordno,
                                             Reels = s.Reels,
                                             Qtyton = s.Qtyton,
                                             Days = s.Day,
                                             Whsedesc = s.Whsedesc,
                                             Co = s.Co,
                                             Finished = s.Finished,
                                             Pm = s.Pm,
                                             PurchaseOrder = s.PurchaseOrder,
                                             Diameter = s.Diameter,
                                             Rtadate = s.Rtadate,
                                             Custno = s.Custno,
                                             UpdDte = s.UpdDte
                                         });
            }

            return stockDetailsList;
        }

这是查询在 T-SQL 中的样子

SELECT 
   Millcd, Matercd,
   Proddesc, Grammage,
   Reelwidth, Ordercode,
   Buyordno,
   SUM(Reels) as Reels,
   SUM(Qtyton) as Qtyton,
   Whsedesc, Co, 
   (cast(FLOOR(avg(cast(DateProd as float))) as datetime)) As Days,
   Finished, Pm,
   PurchaseOrder,
   Diameter, Rtadate,
   Custno, UpdDte
FROM StockDetail
WHERE custno = @custcode
GROUP BY Millcd, Matercd, Proddesc, Grammage, Reelwidth, Ordercode, Buyordno, 
         Whsedesc, Co, Finished, Pm, PurchaseOrder, Diameter, Rtadate, Custno, UpdDte

【问题讨论】:

    标签: tsql entity-framework lambda group-by average


    【解决方案1】:

    不确定这是否对您有帮助,但您可以添加

      Reels = (_entities.StockDetails 
                .Where(x => x.Custno == CustNo).Sum(x=>x.Reels)) 
    

    而不是 x.Reels 在您的 select 中,并对 Qtyton 执行相同操作

    对于您的平均使用平均扩展名

    在你的 where 语句之后,你的 select 将类似于 .Select(x=&gt;new {...}),然后是 group by

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2022-12-03
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多