2014-04-24 34 views
0

這裏是我的域名的簡化版本:LINQ表達式來獲取子記錄與唯一父

class Document 
{ 
    int id {get;set;} 
    string name {get;set;} 
    List<Version> Version {get;set;} 
} 

class Version 
{ 
    int id {get;set;} 
    string name {get;set;} 
    List<VersionActivity> VersionActivity {get;set;} 
    [ForeignKey] 
    int DocumentID {get;set;} 
} 

class VersionActivity 
{ 
    int id {get;set;} 
    DateTime DateOfActivity {get;set;} 
    string ActivityName {get;set;} 
    [ForeignKey] 
    int VersionID {get;set;} 
} 

尋找一個LINQ查詢,返回最近的20個版本,但不能有重複的文檔。

實施例:

  • 我有1,2和3
  • IDS我編輯文件3(即,存在於活性)的版本10,20和文獻1的30昨天
  • 今天我編輯了文檔2的版本40,50和60(因此這些文檔版本位於最近編輯的文檔列表之上)。
  • 查詢需要從文獻2中記錄1,然後返回僅最新的文檔版本文獻1的最新文件版本記錄2.

我想只有一個往返到數據庫。如果SQL更容易,我可以使用它,但我更喜歡LINQ查詢。

謝謝。

+0

你的榜樣的最後一點意味着在查詢結果文獻2的兩個版本? – har07

+0

我修正了我的例子中的拼寫錯誤。我更改了第3點以引用文檔2.基本上,我想要最近編輯的文檔版本 - 但是如果該列表中有多個文檔版本具有相同的父級(文檔),我想排除除第一個文件版本。 – apierceSO

+0

因此,如果您有50份文件在過去5分鐘內被編輯過兩次,那麼您只需要不同文件的最新更新版本? (對不起,您在示例中僅使用2個文檔的事實讓我感到困惑。) – krillgar

回答

0

我認爲你的問題可以改爲'列出前20位文件,更新日期的後續順序'。下面是查詢

from d in documents 
let latestVersion = (from v in d.Version 
        let latestDate = v.VersionActivity.OrderByDescending (va => va.DateTime).Select(va => va.DateOfActivity).First() 
        orderby latestDate descending 
        select {Version = v, LatestDate = latestDate}).First() 
select new {Document = d, Version = latestVersion}; 

或者,如果所有的版本號是增量的每個文檔,只需查詢

from d in document 
let latestVersion = d.Version.OrderByDescending(v => v.Id).First() 
select new {Document = d, Version = latestVersion}; 
+0

我在第一個例子中得到編譯錯誤(va => va.DateTime)不起作用 - 如果它應該讀取va.DateTimeOfActivity,那麼下面的第一個函數不會編譯。我嘗試過不同的事情,因爲我有點想知道你要去哪裏,但是我很大膽地用LINQ語法 – apierceSO

+0

我的錯。更新第一種方法。 – qxg

+0

仍然無法正常工作......因爲VersionActivity中沒有DateTime字段,所以我稍微修改了一下代碼......編譯錯誤按照從句 – apierceSO