2013-02-20 54 views
0

我有一個表時間戳和一個pable項目。SQL - Linq/EF/Lambda

我需要所有項目的柱子「Finished == false」與上次生成的時間戳。

我currrent代碼:

var result = from p in _contextProvider.Context.Projects 
        join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject 
        where p.Finished == false 
        orderby t.End 
        select new { p.Name, t.End }; 

如何 「按項目最大(t.Enc)組」 做一個? PS:對不起,我不好的冠軍,但我不知道我使用的語法:(

回答

0

好吧,這是棘手的問題這裏是你會怎麼做在SQL,它是比較容易的:

SELECT * 
FROM Projects p 
JOIN Timestamps t ON p.Guid = t.GuidProject 
WHERE p.Finshed = FALSE AND 
t.END = (
    SELECT max(t1.END) 
    FROM Projects p1 
    JOIN Timestamps t1 ON p1.Guid = t1.GuidProject 
    WHERE p.Finshed = FALSE AND p.Guid = p1.Guid 
) 

將其轉換爲LINQ的將是棘手。這是我試過,但我不能對它進行測試。

 var baseQuery = _contextProvider.Context.Projects 
       .Join(_contextProvider.Context.Timestamps, p => p.Guid, t => t.GuidProject, (p, t) => new {p, t}) 
       .Where(o => o.p.Finished == false); 

     var result = baseQuery.Select 
      .Where(o => o.t.End == baseQuery 
          .Where(o2 => o2.p == o.p) 
          .Select(o2 => o2.t.End) 
          .Max() 
        ).Select(o => new {o.p.Name, o.t.End}); 

可能是我過於複雜了一點,它可以與group by來實現,你可以試試這個:

 var result = (from p in _contextProvider.Context.Projects 
         join t in _contextProvider.Context.Timestamps on p.Guid equals t.GuidProject 
         where p.Finished == false 
         group t.End by p.Name into g 
         select new { name=g.Key, end=g.Max()}); 
+0

但後來我只得到一行。每個項目我都需要一行。 – spitzbuaamy 2013-02-20 09:11:05

+0

@spitzbuaamy檢查編輯,我提出了2個版本。 – Andrey 2013-02-20 10:43:35

0

對於快速和骯髒的解決方案,您可以嘗試按t.End降序排列,然後僅取前1個/首先或默認結果。