У меня есть следующая схема:
product
- productID (PK)
- name
- units
purchase
- purchaseID (PF)
- productID (FK)
- soldUnits
- woUnits
boxContents
- boxID (PK)
- puchaseID (FK)
- count
и следующий запрос Linq to SQL:
var qStockLevel = from pr in db.products
select new
{
pr.productID,
pr.name,
totalUnits = (from pu in db.purchases
where pu.productID == pr.productID
select pu).Count() * pr.units,
sold = (from pr2 in db.products
join pu in db.purchases on pr.productID equals pu.productID into pp
where pr2.productID == pr.productID
from pu2 in pp.DefaultIfEmpty()
select (int?) pu2.soldUnits ?? 0).Sum(),
writtenOff = (from pr2 in db.products
join pu in db.purchases on pr.productID equals pu.productID into pp
where pr2.productID == pr.productID
from pu in pp.DefaultIfEmpty()
select (int?)pu.woUnits ?? 0).Sum(),
onDisplay = (from pr2 in db.products
join bc in db.boxContents on pr.productID equals bc.purchase.productID into bp
where pr2.productID == pr.productID
from bc in bp.DefaultIfEmpty()
select (int?)bc.count ?? 0).Sum(),
available = (totalUnits - sold - writtenOff - onDisplay),
};
«Доступный» столбец в конце не работает, но я включил его, чтобы проиллюстрировать то, что я пытаюсь достичь - столбец, рассчитанный по уже сгенерированным столбцам. Это возможно? Я мог сделать это на уровне представления, но хотел проверить, сработает ли это сначала.
Кроме того, на мой взгляд (новичок в Linq), запрос выглядит неэффективным, поскольку я повторяю себя в создании столбцов writeOff и sold. Есть ли лучший способ добиться этого, когда у меня есть агрегатные функции.
Спасибо.
EDIT
Еще одна вещь - я хочу возвращать только те строки, где «доступно»> 0.