public static IEnumerable <long[]> AuIdToAuId(long start, long end, MagEntityAuId[] startEntityAuIds, MagEntityAuId[] endEntityAuIds) { var result = new ConcurrentBag <long[]>(); var startIds = startEntityAuIds.Select(sau => sau.Id).ToArray(); var endIds = endEntityAuIds.Select(eau => eau.Id).ToArray(); var calcActions = new Action[2]; calcActions[0] = () => { foreach (var singleResult in startIds .Intersect(endIds) .Select(id => new[] { start, id, end })) { // AuId - Id - AuId result.Add(singleResult); } }; calcActions[1] = () => { foreach ( var singleResult in startEntityAuIds.SelectMany(sau => sau.Authors).Select(au => au.AffiliationId) .Intersect(endEntityAuIds.SelectMany(eau => eau.Authors).Select(au => au.AffiliationId)) .Where(afId => afId != 0).Select(id => new[] { start, id, end })) { // AuId - AfId - AuId result.Add(singleResult); } }; Parallel.Invoke(calcActions); Parallel.ForEach(startIds, startId => { var startIdRIds = MagHelper.QueryRId(startId); foreach (var singleResult in startIdRIds.Intersect(endIds) .Select(id => new[] { start, startId, id, end })) { // AuId - Id - Id - AuId result.Add(singleResult); } }); return(result); }
public static IEnumerable <long[]> AuIdToId(long start, long end, MagEntityAuId[] startEntityAuIds, MagEntity endEntity) { var result = new ConcurrentBag <long[]>(); if (endEntity == null) { return(new long[0][]); } if (endEntity.Authors != null) { if (endEntity.Authors.Any(au => au.Id == start)) { // AuId - Id result.Add(new[] { start, end }); } var afIds = startEntityAuIds.SelectMany(auId => auId.Authors .Select(afId => afId.AffiliationId)).ToArray(); Parallel.ForEach(endEntity.Authors, author => { if (author.AffiliationId != 0 && afIds.Contains(author.AffiliationId)) { // AuId - AfId - AuId - Id result.Add(new[] { start, author.AffiliationId, author.Id, end }); } }); } var middleIds = startEntityAuIds.Select(entity => entity.Id).Distinct().ToArray(); Parallel.ForEach(middleIds, middleId => { var middleEntity = MagHelper.GetEntityById(middleId); if (middleEntity.ReferenceIds != null) { if (middleEntity.ReferenceIds.Contains(end)) { // AuId - Id - Id result.Add(new[] { start, middleId, end }); } foreach (var rId in middleEntity.ReferenceIds) { var ridRids = MagHelper.QueryRId(rId); if (ridRids == null) { continue; } if (ridRids.Contains(middleId)) { // AuId - Id - Id - Id result.Add(new[] { start, middleId, rId, end }); } } } var possibleIds = new List <long>(); if (middleEntity.Fields != null && endEntity.Fields != null) { possibleIds.AddRange(middleEntity.Fields.Select(mf => mf.Id).Intersect( endEntity.Fields.Select(ef => ef.Id))); } if (middleEntity.Authors != null && endEntity.Authors != null) { possibleIds.AddRange(middleEntity.Authors.Select(mau => mau.Id).Intersect( endEntity.Authors.Select(eau => eau.Id))); } if (middleEntity.Conference != null && endEntity.Conference != null) { if (middleEntity.Conference.Id == endEntity.Conference.Id) { possibleIds.Add(middleEntity.Conference.Id); } } if (middleEntity.Journal != null && endEntity.Journal != null) { if (middleEntity.Journal.Id == endEntity.Journal.Id) { possibleIds.Add(middleEntity.Journal.Id); } } foreach (var singleResult in possibleIds.Where(id => id != 0) .Select(id => new[] { start, middleId, id, end })) { // AuId - Id - FId/AuId/CId/JId - Id result.Add(singleResult); } }); return(result); }