using System.Collections.Generic;
public class GenericObject
public int Id { get; set; }
public class ObjectVersion
public int Id { get; set; }
public GenericObject GenericObject { get; set; }
public class ObjectDependency
public string Name { get; set; }
public ObjectVersion ObjectVersion1 { get; set; }
public ObjectVersion ObjectVersion2 { get; set; }
public static void Main()
GenericObject go1 = new GenericObject()
GenericObject go2 = new GenericObject()
GenericObject go3 = new GenericObject()
ObjectVersion ov1 = new ObjectVersion()
ObjectVersion ov2 = new ObjectVersion()
ObjectVersion ov3 = new ObjectVersion()
ObjectVersion ov4 = new ObjectVersion()
List<ObjectDependency> dependencies = new List<ObjectDependency>();
ObjectDependency d1 = new ObjectDependency()
ObjectDependency d2 = new ObjectDependency()
ObjectDependency d3 = new ObjectDependency()
Console.WriteLine("Get all ObjectDependencies containing ov2");
IEnumerable<ObjectDependency> ov2Dependencies = dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
foreach (ObjectDependency dependency in ov2Dependencies)
Console.WriteLine(dependency.Name);
Console.WriteLine("Get all ObjectVersions dependent on ov2");
IEnumerable<ObjectVersion> ov2AllDependentObjectVersions = dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Select(d => d.ObjectVersion1)
.Union(dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Select(d => d.ObjectVersion2))
.Where(o => o.Id != ov2.Id)
foreach (ObjectVersion ov in ov2AllDependentObjectVersions)
Console.WriteLine(ov.Id);
Console.WriteLine("Get latest ObjectVersions dependent on ov2 with different GenericObject");
IEnumerable<ObjectVersion> ov2LatestDependentObjectVersions = dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Select(d => d.ObjectVersion1)
.Union(dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Select(d => d.ObjectVersion2))
.Where(o => o.Id != ov2.Id)
.GroupBy(o => o.GenericObject.Id)
.Select(g => g.OrderByDescending(o => o.Id).FirstOrDefault())
foreach (ObjectVersion ov in ov2LatestDependentObjectVersions)
Console.WriteLine(ov.Id);
Console.WriteLine("Get latest ObjectDependencies containing ov2 with different GenericObject");
IEnumerable<ObjectDependency> ov2LatestDependencies = dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Where(x => x.ObjectVersion1.Id == ov2.Id)
ObjectVersion = x.ObjectVersion2
dependencies.Where(d => d.ObjectVersion1.Id == ov2.Id || d.ObjectVersion2.Id == ov2.Id)
.Where(x => x.ObjectVersion2.Id == ov2.Id)
ObjectVersion = x.ObjectVersion1
.GroupBy(x => x.ObjectVersion.GenericObject.Id)
.Select(x => x.OrderByDescending(y => y.ObjectVersion.Id).FirstOrDefault())
.Select(x => x.ObjectDependency)
foreach (ObjectDependency dependency in ov2LatestDependencies)
Console.WriteLine(dependency.Name);