Linq to Sql 3 加入 group 和 min()

Linq to Sql 3 joins with group and min()

我正在尝试将下面的 SQL 转换为 Linq。我还没有弄清楚 GROUP BYMIN() 或额外组织加入条件的语法。

SELECT DISTINCT o.OrganizationHierarchyUnitLevelThreeNm, o.OrganizationHierarchyUnitLevelFourNm, a.LabAssetSerialNbr, MIN(a.SystemCreatedOnDtm) MinCreated
FROM vw_DimLabAsset a
INNER JOIN vw_FactWorker w ON a.LabAssetAssignedToWorkerKey = w.WorkerKey
INNER JOIN vw_DimOrganizationHierarchy o ON w.OrganizationHierarchyKey = o.OrganizationHierarchyKey
    AND o.OrganizationHierarchyUnitLevelThreeNm IS NOT NULL
    AND o.OrganizationHierarchyUnitLevelFourNm IS NOT NULL
GROUP BY o.OrganizationHierarchyUnitLevelThreeNm, o.OrganizationHierarchyUnitLevelFourNm, a.LabAssetSerialNbr

这是我到目前为止设法得到的:

var pphw = from a in Vw_DimLabAsset
       where a.LabAssetHardwareStatus != "Retired" && (a.LabAssetHardwareSubStatus == null || a.LabAssetHardwareSubStatus != "Archive") && types.Contains(a.LabAssetTypeNm) // (a.LabAssetTypeNm == "u_cmdb_ci_prototype_system" || a.LabAssetTypeNm == "u_cmdb_ci_silicon")
       join w in Vw_FactWorker on a.LabAssetAssignedToWorkerKey equals w.WorkerKey
       join o in Vw_DimOrganizationHierarchy on w.OrganizationHierarchyKey equals o.OrganizationHierarchyKey
       select new { o.OrganizationHierarchyUnitLevelThreeNm, o.OrganizationHierarchyUnitLevelFourNm, a.LabAssetSerialNbr };

以下是我翻译查询的方式:

var ans = (from a in vw_DimLabAsset
           join w in vw_FactWorker on a.LabAssetAssignedToWorkerKey equals w.WorkerKey
           join o in vw_DimOrganizationHierarchy on w.OrganizationHierarchyKey equals o.OrganizationHierarchyKey
           where o.OrganizationHierarchyUnitLevelThreeNm != null && o.OrganizationHierarchyUnitLevelFourNm != null
           group new { o, a } by new { o.OrganizationHierarchyUnitLevelThreeNm, o.OrganizationHierarchyUnitLevelFourNm, a.LabAssetSerialNbr } into oag
           select new {
               oag.Key.OrganizationHierarchyUnitLevelThreeNm,
               oag.Key.OrganizationHierarchyUnitLevelFourNm,
               oag.Key.LabAssetSerialNbr,
               MinCreated = oag.Min(oa => oa.a.SystemCreatedOnDtm)
           }).Distinct();