C# 在linq中使用max并使用c进行连接#

C# 在linq中使用max并使用c进行连接#,c#,linq,join,max,C#,Linq,Join,Max,我有一个主细节表,我想得到主连接和细节的列表,其中细节在某些字段中是最大的。 例如,我有一个名为Document的表,还有一个名为Revision的子表。我想获取文档联接修订列表,其中修订字段为max ? 一种解决办法是: using ( ProcurementDataContext dc = new ProcurementDataContext() ) { var temp = from ddr in dc.E_DesignDocumentRevisions

我有一个主细节表,我想得到主连接和细节的列表,其中细节在某些字段中是最大的。 例如,我有一个名为Document的表,还有一个名为Revision的子表。我想获取文档联接修订列表,其中修订字段为max ? 一种解决办法是:

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

}

如何仅在一个查询中实现这一点?

理论上讲,在您要求枚举结果之前,由于延迟执行,它仍然是一个查询。当您对结果进行迭代时,查询将被执行,因此与将查询分割成更小的块相比,对性能的影响非常小

但是,如果要合并两个块,可以将第一个块叠成第二个块:

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

谢谢你的帮助。你是对的,但我找到了一个很好的方法,用非常小的查询:

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

当我们在GROUPBY子句中使用来自一些表(不止一个)的文件时,linq将在生成的查询中连接它们。再次感谢您的帮助。您是对的,但我发现了一个非常小的查询:var result=from ddr in db.E_DesignDocumentRevisions group ddr by new{ddr.DesignDocumentID,ddr.E_DesignDocument.DocumentNumber}进入g选择new{MaxRevision=g.Max(x=>x.Revision),g.Key.DesignDocumentID,g.Key.DocumentNumber};当我们在GROUPBY子句中使用来自一些表(不止一个)的文件时,linq将在生成的查询中连接它们。又是坦克