C# 在linq中使用max并使用c进行连接#
我有一个主细节表,我想得到主连接和细节的列表,其中细节在某些字段中是最大的。 例如,我有一个名为Document的表,还有一个名为Revision的子表。我想获取文档联接修订列表,其中修订字段为max ? 一种解决办法是: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
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将在生成的查询中连接它们。又是坦克