2013-09-19 3 views
1

я пытаюсь сделать это на LINQ:LINQ с несколькими столбцами и операций

select p.ProductID, p.ArticleCode, SUM((case h.OperationType when 0 then 1 else -1 end) * h.[Count]) 
from Products p 
inner join StockItems s on p.ArticleCode = s.ArticleCode 
inner join StockHistorical h on s.ArticleID = h.ArticleID 
where h.[Date] < '23/08/2013 11:30:00' 
group by p.ProductID, p.ArticleCode 

У меня есть это:

 var products = (from p in e.Products 
         join s in e.StockItems on p.ArticleCode equals s.ArticleCode 
         join h in e.StockHistoricals on s.ArticleID equals h.ArticleID 
         where h.Date < DateTime.Parse("23/08/2013 11:30:00") 
         group p by p.ProductID into StockResult 
         select new { }); 

Каждый знает, как я могу сделать

SUM((case h.OperationType when 0 then 1 else -1 end) * h.[Count])

с LINQ?

Спасибо!

Я забыл сказать, что проблема заключается в «группе», потому что я не могу получить доступ к свойству OperationType в группе StockResult.

Решенный! Ключ:

let combined = new 
{ 
    Product = p, 
    HistoryCount = (h.OperationType == 0 ? 1 : -1) * h.Count 
} 
+0

Вы можете принять результат, а затем применить все изменения в нем, например, при использовании foreach для результата. –

ответ

2
... 
let combined = new 
{ 
    Product = p, 
    HistoryCount = (h.OperationType == 0 ? 1 : -1) * h.Count 
} 
group combined by combined.Product.ProductID into StockResult 
select new 
{ 
    ProductID = StockResult.Key, 
    Total = StockResult.Sum(x => x.HistoryCount) 
} 
+0

не нужно 'return', поскольку оно все еще является выражением с одним выражением. подразумевается «возврат». –

+0

да, но группа не позволяет мне использовать «h.», А в StockResult я не могу использовать свойство OperationType: s. проблема в том, что мне нужно умножить h.Count на (1 или -1) в зависимости от того, является ли операция входным (0) или выходным (1). – tincho87

+0

@ tincho87 вам нужна сумма 'h' в контексте группировки или для продукта? – James

0

Это не прямой перевод, но я бы с:

(h.Count(his => his.OperationType != 0) 
    - h.Count(his => his.OperationType == 0)) 
    * h.Count() 

Это должно быть функционально эквивалентны, и, кажется, лучше отражают то, что» re пытающийся сделать.

+2

Три звонка 'Count'? Не лучший способ? – mattytommo

+0

@mattytommo Все это делается в базе данных, которая должна быть в состоянии оптимизировать ее довольно хорошо. Если бы Линк был объектом, я бы искал что-то более оптимальное по сравнению с чем-то, описывающим основной алгоритм. – Servy

0

Вы пытаетесь сделать что-то подобное? Я не уверен, что это сработает.

select new 
{ 
S=Sum(((h.OperationType)!=0?-1:1)*h.Count) 
} 
+0

Вам не хватает начала лямбда в вашем вызове 'Sum'. – Servy

Смежные вопросы