Entity Framework лямбда-запрос с групповой, суммой и средней - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть объект с именем StockDetails, использующий Entity Framework, см. Рисунок ниже

Я хочу получить список IEnumerable<StockDetail>, суммированный как Reels, Qtyton, средняя дата от Days(datetime) и группировка по остальным свойствам.

Я строю слой данных (WCF Services) с Entity Framework как ORM, некоторые из служб - это старые SQL-запросы, которые я пытаюсь преобразовать в linq/ лямбба выражение.Но я довольно плохо знаком с тем, как писать, и мне нужна помощь.

Вот как я начал запрос в лямбда-выражении, но застрял в части 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

1 Ответ

2 голосов
/ 21 декабря 2011

не уверен, поможет ли это вам, но вы можете добавить

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

вместо x.Reels на ваш выбор и сделать то же самое с Qtyton

для вашего среднего использованиясреднее расширение

ваш выбор будет выглядеть примерно как .Select(x=>new {...}) после вашего оператора where, а затем группы по

...