2011-12-21 52 views
2

我有一个实体,称为StockDetails使用实体框架,见下文与GROUPBY,和实体框架拉姆达查询和平均

我想从Days获取列表IEnumerable<StockDetail>,通过ReelsQtyton,平均日总结图片(日期时间)和其他属性分组。

我正在用实体框架构建一个数据层(WCF服务)作为ORM,其中一些服务是我试图转换为linq/lamdba表达式的旧SQL查询。但我对于如何写作和想要一些帮助很新。

这是我在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; 
     } 

enter image description here

这是查询的外观在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 

回答

2

不知道这是否会帮助你,但你可以添加

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

,而不是在你的选择x.Reels,并做Qtyton

同样为你的平均使用平均延长

你的选择会是这个样子.Select(x=>new {...})您的WHERE语句则该组后

+1

很酷的答案!帮助! – callisto 2012-03-02 13:30:56