2012-03-07 40 views
2

我有这样一段简单的SQL不正是我需要的...的Sql转换到LINQ - 左加入,集团,Min和点心

SELECT MIN(pb.Id) AS Id, MIN(pb.Quantity) AS Requested, SUM(pbi.Quantity) AS Total 
FROM PickBatchItems AS pb 
LEFT JOIN PickBatchItemLocations AS pbi ON pb.Id = pbi.PickBatchItemId 
GROUP BY pb.Id 

结果...

Id, Requested, Total 
1 100  NULL 
2 200  165 
3 200  NULL 

这正是我想要的,但我需要这个在Linq。

到目前为止,我有...

var pick = (from pb in db.PickItems 
      join pbi in db.PickItemLocations on pb.Id equals pbi.PickBatchItemId into TempJoin 
      from resList in TempJoin.DefaultIfEmpty() 
      where pb.Id == iPickItemId 
      group resList by pb.Id into g 
      select new 
      { 
       Id = g.Key, 
       RequestedQuantity = g.Min(???????????????????????), 
       SentQuantity = g.Sum(a => a.Quantity == null ? 0 : a.Quantity), 
      }).FirstOrDefault(); 

我怎样才能得到RequestedQuantity

UPDATE:

由于 '大卫B' 我找到了答案:

var pick = (from pb in db.PickBatchItems 
      join pbi in db.PickBatchItemLocations on pb.Id equals pbi.PickBatchItemId into TempJoin 
      from resList in TempJoin.DefaultIfEmpty() 
      where pb.Id == iPickItemId 
      group new { PickItem = pb, PickItemLocation = resList } by pb.Id into g 
      select new 
      { 
       Id = g.Key, 
       RequestedQuantity = g.Min(a => a.PickItem.Quantity), 
       SentQuantity = g.Sum(a => a.PickItemLocation.Quantity == null ? 0 : a.PickItemLocation.Quantity), 
      }).FirstOrDefault(); 

此连接并返回我的两个表,即使PickBatchItemLocations表是空的。

回答

4

假设PickItems.Id是主键,加入似乎是不需要旅行的道路的第一步。

from pb in db.PickItems 
where pb.Id = iPickItemId //this wasn't in the original sql 
select new 
{ 
    Id = pb.Id, 
    RequestedQuantity = pb.Quantity, 
    SentQuantity = pb.PickItemLocations.Sum(pbi => pbi.Quantity) 
}; 

如果您仍然想利用漫长的道路,这样做:

group new {PickItem = pb, PickItemLocation = resList } by pb.Id into g 
select new 
{ 
    Id = g.Key, 
    RequestedQuantity = g.Min(x => x.PickItem.Quantity), 
    SentQuantity = g.Sum(x => x.PickItemLocation.Quantity ?? 0) 
} 
+0

如果他/她是在分组'pb.Id'它不能是主键。我认为你的第二个例子可能更准确。 – Joe 2012-03-07 17:09:56

+0

尽管SQL中的“MIN(pb.Id)AS Id”根本没有任何意义,所以谁知道。有一个upvote。 – Joe 2012-03-07 17:12:06

+0

@JoeTuskan这个连接引入了id的重复。 – 2012-03-07 17:14:36