2013-04-10 164 views
1

我正在使用Entity Framework來連接到MySQL。選擇第一個記錄每個組

我有一個實現顛覆技術的增量數據。每組顛覆記錄具有相同的LinkedId並且由UpdatedTime分開。

我的期望是從數據庫中獲取每條記錄的最新版本。因此,我寫了LINQ聲明象下面這樣:

public List<Entry> LoadFinalEntries(int rptId) { 
    return (from ent in ctx.Entries 
      where ent.ReportId == rptId 
      orderby ent.LinkedId, ent.UpdatedTime descending 
      group ent by ent.LinkedId into svnEnt 
      select svnEnt.FirstOrDefault()).ToList(); 
} 

但在運行時,它拋出一個EntityCommandCompilationException告知「指定的方法不支持。」我知道該方法是FirstOrDefault,但無法找到修復它。

請幫我找出另一種方法。

+0

你使用MSSQL嗎?我無法重現這個問題... – 2013-04-10 10:04:54

+0

哦,對不起!我正在使用MySQL – 2013-04-10 10:07:06

回答

0

我已經找到了更好的解決方案指this article

public List<Entry> GetFinalEntries(int rptId) { 
    // Get the latest updated time for each linked id 
    var latestUpdatedTimes = from ent in ctx.Entries 
          where ent.ReportId == rptId 
          group ent by ent.LinkedId into svnEnt 
          select new { LinkedId = svnEnt.Key, UpdatedTime = svnEnt.Max(ent => ent.UpdatedTime) }; 

    // Compare (by joining) to get full entries 
    var latestEntries = from ent in ctx.Entries 
         where ent.ReportId == rptId 
         join time in latestUpdatedTimes 
          on new { ent.LinkedId, ent.UpdatedTime } equals time 
         select ent; 

    return latestEntries.ToList(); 
} 

後現在它工作正常。

1

您認爲如何使用內部查詢?

return (from ent in ctx.Entries 
      where ent.ReportId == rptId && 
      ent.UpdatedTime == 
       (from inner in ctx.Entries 
       where inner.LinkedId == ent.LinkedId && 
       inner.ReportId == rptId 
       select inner.UpdatedTime).Max() 
      select ent).ToList(); 
+0

謝謝!有用。然而,我想使用LINQ的優勢,您的查詢是我通過直接查詢到數據庫。 – 2013-04-11 03:07:53