2010-02-22 29 views
0

我有一個主 - 細節表,我想要獲得主連接的列表,其中一些字段中的細節是最大的。 例如我有一個名爲Document的表,並且還有一個名爲Revision的子表。我想要獲得文檔連接的修訂列表,其中修訂的字段最大爲 ? 一種解決方案是:在c#中使用max和linq一起使用#

using (ProcurementDataContext dc = new ProcurementDataContext()) 
{ 

    var temp = from ddr in dc.E_DesignDocumentRevisions 
       group ddr by ddr.DesignDocumentID into g 
       select new { MaxRevision = g.Max(x => x.Revision), g.Key }; 

    var result = from t in temp 
      join ddr in dc.E_DesignDocumentRevisions 
      on new { DesignDocumentID = t.Key, Revision = t.MaxRevision } equals new { ddr.DesignDocumentID, ddr.Revision } 
      join dd in dc.E_DesignDocuments 
      on ddr.DesignDocumentID equals dd.ID 
      where dd.DesignDocumentTypeID == DesignDocumentTypes.MR 
      select new { ddr.ID, dd.DocumentNumber }; 

    foreach (var item in result) 
    { 
     dic.Add(item.ID, item.DocumentNumber.ToString()); 
    } 

} 

我如何能做到這一點的只有一個查詢?

回答

1

坦克對您有所幫助。你是對的,但我發現了一個偉大的方式具有非常較小的查詢:

var result = from ddr in db.E_DesignDocumentRevisions 
         group ddr by new 
              { 
               ddr.DesignDocumentID, 
               ddr.E_DesignDocument.DocumentNumber 
              } 
         into g 
         select new 
            { 
             MaxRevision = g.Max(x => x.Revision), 
             g.Key.DesignDocumentID, 
             g.Key.DocumentNumber 
            }; 

當我們使用一些表(不止一個)在GROUP BY子句中的LINQ的Fileds將加入他們的行列中生成的查詢。坦克再次

1

理論上好吧,直到你要求枚舉的結果,它仍然是一個查詢,由於延遲執行。查詢將在迭代結果時執行,因此與將查詢分隔成更小的塊相比,很少影響性能。

但是,如果您是在尋找剛剛合併兩個塊,你可以覆瓦狀排列的第一個到第二:

var result = from t in from 
        ddr in dc.E_DesignDocumentRevisions 
        group ddr by ddr.DesignDocumentID into g 
        select new { MaxRevision = g.Max(x => x.Revision), g.Key } 
      join ddr in dc.E_DesignDocumentRevisions 
      on new { DesignDocumentID = t.Key, Revision = t.MaxRevision } equals new { ddr.DesignDocumentID, ddr.Revision } 
      join dd in dc.E_DesignDocuments 
      on ddr.DesignDocumentID equals dd.ID 
      where dd.DesignDocumentTypeID == DesignDocumentTypes.MR 
      select new { ddr.ID, dd.DocumentNumber }; 
+0

坦克對您有所幫助。你是對的,但我發現了一個偉大的方式與 非常小的查詢:VAR的結果=由新{ddr.DesignDocumentID,DDR在db.E_DesignDocumentRevisions組DDR DDR。 E_DesignDocument.DocumentNumber} into g select new {MaxRevision = g.Max(x => x.Revision),g.Key.DesignDocumentID,g.Key.DocumentNumber};當我們在Group by子句中使用來自某些表(多於一個)的文件時,linq會將它們加入到生成的查詢中。坦克再次 – 2010-02-23 10:45:52