使用c#使用max并在linq中连接在一起

时间:2010-02-22 13:47:47

标签: c# linq join max

我有一个主 - 详细信息表格,我希望得到主要联接的列表,其中详细信息在某些文件中是最大的。 例如,我有一个名为Document的表,还有一个名为Revision的子表。我想得到文件连接的列表修订版,其中版本提交最大 ? 一个解决方案是:

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());
    }

}

如何只在一个查询中执行此操作?

2 个答案:

答案 0 :(得分: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 };

答案 1 :(得分: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会将它们连接到生成的查询中。坦克再次