Having three tables (Item, Purchase, PurchaseItem) I am trying to write a linq query which finds how many valid purchases an item is included in.
In standard SQL I would use the subquery with a count, but I can't seem to get a linq query to do this.

SQL:
select i.name,
InTrade = (select count(*) from Purchase p join PurchaseItem pi on p.id = pi.PurchaseId where p.Isvalid = 1 and pi.ItemId = i.Id)
from Item i
Linq:
from i in Items select new
{
i.Name,
InTrade = from pi in PurchaseItems where pi.ItemId == i.ID
select new
{
pi,
Purchase = from p in Purchases where p.ID == pi.PurchaseId
select new { p }
}
}
Here I am trying to retrieve all my data in a query, and I would perhaps need another query to actually get what I want. I am probably headed down a troublesome road with this approach, so perhaps someone could shed some light on the "best practice" of achieving this in linq.
I've prepared some test data for this example:
if exists (select * from sysobjects where name = 'PurchaseItem') drop table PurchaseItem
if exists (select * from sysobjects where name = 'Item') drop table Item
if exists (select * from sysobjects where name = 'Purchase') drop table Purchase
go
create table Item
(
ID int not null primary key,
Name nvarchar(30) not null
)
create table Purchase
(
ID int not null primary key,
Name nvarchar(30) not null,
ConfirmedDate datetime,
Isvalid bit not null
)
create table PurchaseItem
(
ID int not null primary key,
PurchaseId int null references Purchase(ID),
ItemId int null references Item(ID)
)
insert Item values (1, 'Bread')
insert Item values (2, 'Beer')
insert Item values (3, 'Wine')
insert Item values (4, 'Milk')
insert Item values (5, 'Apple')
insert Item values (6, 'Steak')
insert Item values (7, 'Hamburger')
insert Item values (8, 'Vinegar')
insert Purchase values (1, 'Purchase 1', null, 1)
insert Purchase values (2, 'Purchase 2', null, 0)
insert Purchase values (3, 'Purchase 3', '2008-1-7', 1)
insert PurchaseItem values (1, 1, 1)
insert PurchaseItem values (2, 1, 2)
insert PurchaseItem values (3, 1, 3)
insert PurchaseItem values (4, 1, 4)
insert PurchaseItem values (5, 1, 5)
insert PurchaseItem values (6, 1, 6)
insert PurchaseItem values (7, 2, 2)
insert PurchaseItem values (8, 3, 2)
insert PurchaseItem values (9, 3, 1)
insert PurchaseItem values (10, 3, 5)