2013-08-12 5 views
-1

У меня есть таблица инвентаря и таблица запасов. Предметы из инвентаря могут быть либо проданы, либо свободно распространены. Я хочу написать запрос, который извлекает для каждого элемента общую сумму продажи, общую сумму бесплатно и сгенерированную выручку для транзакций продажи.Как написать этот запрос sql с использованием linq и lambda

что-то вдоль линий:

select i.Id,i.Title, 
Sum(case when transactiontype=1 then s.MovedQuantity else 0 end) sold, 

Sum(case when transactiontype=1 then s.MovedQuantity*s.UnitPrice else 0 end) Revenue, 

Sum(case when transactiontype=0 then s.MovedQuantity else 0 end) distributed 

From Inventory i,StockTransactions s 

where i.Id=s.ItemId 

group by i.Id,i.Title 

, как это может быть сделано с Linq/лямбда?

+0

попробовать это: http://stackoverflow.com/questions/15577890/how-to-use-lambda-in -linq-select-statement – pageman

+0

Я знаю, как использовать лямбда с linq. Мне просто нужна помощь, переводя этот sql в действительное выражение – kfc

+0

С какой частью, в частности, с вами возникают трудности? 'GroupBy',' Select' и 'Sum' должны делать трюк в правильной комбинации. – Chris

ответ

0

Это может быть то, что вам нужно:

var result = Inventory.Join(StockTransactions, x=>x.Id, x=>x.ItemId,(x,y)=>new {x,y}) 
         .GroupBy(a=>new {a.x.Id, a.x.Title}) 
         .SelectMany(a=> 
         new { 
           a.Key.Id, 
           a.Key.Title, 
           sold = a.Sum(b=> b.y.transactiontype == 1 ? b.y.MovedQuantity : 0), 
           Revenue = a.Sum(b=>b.y.transactiontype == 1 ? b.y.MovedQuantity * b.y.UnitPrice : 0), 
           distributed = a.Sum(b=> b.y.transactiontype == 0 ? b.y.MovedQuantity : 0)      
          }); 
+0

спасибо, это именно то, что мне нужно. Я просто заменил SelectMany на Select, чтобы он работал. – kfc

0

Попробуйте

var result = ((from inv in inventry.AsQueryable() 
         join st in stockTransactions.AsQueryable() 
         on inv.Id equals st.Id 
         select new { ID = inv.Id, Title = inv.Title, MovedQuantity = st.MovedQuantity, UnitPrice = st.UnitPrice }) 
         .GroupBy(s=>new {s.ID,s.Title}) 
         .Select(res=>new {Id=res.Key.ID,Title=res.Key.Title,Sold=transactiontype==1?res.Sum(s=>s.MovedQuantity):0, 
         Revenue=transactiontype==1?res.Sum(s=>s.MovedQuantity*s.UnitPrice):0, 
         Distributed=transactiontype==1?res.Sum(s=>s.MovedQuantity):0})).ToList(); 
Смежные вопросы