我有一个主 - 详细信息表格,我希望得到主要联接的列表,其中详细信息在某些文件中是最大的。 例如,我有一个名为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());
}
}
如何只在一个查询中执行此操作?
答案 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会将它们连接到生成的查询中。坦克再次