using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApplication4
public int Id { get; set; }
public string Version { get; set; }
public virtual ICollection<TestOperation> TestOperation { get; set; }
public virtual ICollection<TestOperationDifference> TestOperationDifference { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public Nullable<int> ParentId { get; set; }
public virtual ICollection<Variants> Variants { get; set; }
public class TestOperation
public int Id { get; set; }
public Nullable<int> TestId { get; set; }
public int SourceSubVariantId { get; set; }
public int TargetSubVariantId { get; set; }
public decimal DiffPerc { get; set; }
public virtual SubVariants SubVariants { get; set; }
public virtual SubVariants SubVariants1 { get; set; }
public virtual Test Test { get; set; }
public class TestOperationDifference
public int Id { get; set; }
public Nullable<int> TestId { get; set; }
public int SourceSubVariantId { get; set; }
public int TargetSubVariantId { get; set; }
public decimal DiffPerc { get; set; }
public decimal DiffRec { get; set; }
public virtual SubVariants SubVariants { get; set; }
public virtual SubVariants SubVariants1 { get; set; }
public virtual Test Test { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public int CategoryId { get; set; }
public virtual ICollection<SubVariants> SubVariants { get; set; }
public virtual Category Category { get; set; }
public int Id { get; set; }
public int VariantId { get; set; }
public string Name { get; set; }
public virtual Variants Variants { get; set; }
public virtual ICollection<TestOperationDifference> TestOperationDifference { get; set; }
public virtual ICollection<TestOperationDifference> TestOperationDifference1 { get; set; }
public virtual ICollection<TestOperation> TestOperation { get; set; }
public virtual ICollection<TestOperation> TestOperation1 { get; set; }
public class OutputVariants
public string ParentVariantName { get; set; }
public List<TestList> TestList { get; set; }
public int TestId { get; set; }
public string Version { get; set; }
public List<SubVariantsList> SubVariantsList { get; set; }
public class SubVariantsList
public string SourceSubVariant { get; set; }
public decimal DiffPerc { get; set; }
public string TargetSubVariant { get; set; }
public static void Main(string[] args)
var category = new List<Category>
new Category { Id = 1, Name = "Electronics", ParentId = 0, Variants = new List<Variants>() },
new Category { Id = 2, Name = "Mobile", ParentId = 1, Variants = new List<Variants>() },
new Category { Id = 3, Name = "TV", ParentId = 1, Variants = new List<Variants>() },
new Category { Id = 4, Name = "AC", ParentId =1 , Variants = new List<Variants>() },
new Category { Id = 5, Name = "Sports", ParentId =0 , Variants = new List<Variants>() },
new Category { Id = 6, Name = "Shoes", ParentId =5 , Variants = new List<Variants>() },
new Category { Id = 7, Name = "Clothes", ParentId = 5 , Variants = new List<Variants>() },
var variants = new List<Variants>
new Variants { Id = 11, Name = "Variant1", Type = "Diff", CategoryId = 2, SubVariants = new List<SubVariants>() },
new Variants { Id = 12, Name = "Variant1", Type = "Add", CategoryId = 2, SubVariants = new List<SubVariants>() },
new Variants { Id = 13, Name = "Variant2", Type = "Add", CategoryId = 3, SubVariants = new List<SubVariants>() },
new Variants { Id = 14, Name = "Variant2", Type = "Diff", CategoryId = 2, SubVariants = new List<SubVariants>() },
new Variants { Id = 15, Name = "Variant3", Type = "Add", CategoryId = 6, SubVariants = new List<SubVariants>() },
foreach (var c in variants)
c.Category = category.First(e => e.Id == c.CategoryId);
c.Category.Variants.Add(c);
var subVariants = new List<SubVariants>
new SubVariants { Id = 66, VariantId = 11, Name = "Abc" },
new SubVariants { Id = 67, VariantId = 11, Name = "PQR" },
new SubVariants { Id = 68, VariantId = 11, Name = "Xyz" },
new SubVariants { Id = 69, VariantId = 12, Name = "Abc" },
new SubVariants { Id = 70, VariantId = 12, Name = "PQR" },
new SubVariants { Id = 71, VariantId = 12, Name = "Xyz" },
new SubVariants { Id = 72, VariantId = 13, Name = "Abc" },
new SubVariants { Id = 73, VariantId = 13, Name = "PQR" },
new SubVariants { Id = 74, VariantId = 14, Name = "Abc" },
new SubVariants { Id = 75, VariantId = 14, Name = "PQR" },
new SubVariants { Id = 76, VariantId = 14, Name = "Xyz" },
new SubVariants { Id = 77, VariantId = 15, Name = "Abc" },
new SubVariants { Id = 78, VariantId = 15, Name = "PQR" },
foreach (var c in subVariants)
c.Variants = variants.First(e => e.Id == c.VariantId);
c.Variants.SubVariants.Add(c);
c.TestOperation = new List<TestOperation>();
c.TestOperation1 = new List<TestOperation>();
c.TestOperationDifference = new List<TestOperationDifference>();
c.TestOperationDifference1 = new List<TestOperationDifference>();
var tests = new List<Test>
new Test { Id = 100, Version = "0", TestOperation = new List<TestOperation>(), TestOperationDifference = new List<TestOperationDifference>() },
new Test { Id = 101, Version = "1", TestOperation = new List<TestOperation>(), TestOperationDifference = new List<TestOperationDifference>() },
var testOperations = new List<TestOperation>
new TestOperation { Id = 1, TestId = 100, SourceSubVariantId = 69, TargetSubVariantId = 70, DiffPerc = 99 },
new TestOperation { Id = 2, TestId = 100, SourceSubVariantId = 70, TargetSubVariantId = 71, DiffPerc = 45 },
new TestOperation { Id = 3, TestId = 100, SourceSubVariantId = 72, TargetSubVariantId = 73, DiffPerc = 100 },
foreach (var c in testOperations)
c.Test = tests.First(e => e.Id == c.TestId);
c.Test.TestOperation.Add(c);
c.SubVariants = subVariants.First(e => e.Id == c.SourceSubVariantId);
c.SubVariants.TestOperation.Add(c);
c.SubVariants1 = subVariants.First(e => e.Id == c.TargetSubVariantId);
c.SubVariants1.TestOperation1.Add(c);
var testOperationDifferences = new List<TestOperationDifference>
new TestOperationDifference { Id = 1, TestId = 100, SourceSubVariantId = 66, TargetSubVariantId = 67, DiffPerc = 50,DiffRec=30 },
new TestOperationDifference { Id = 1, TestId = 100, SourceSubVariantId = 67, TargetSubVariantId = 68, DiffPerc = 40,DiffRec=30 },
new TestOperationDifference { Id = 1, TestId = 100, SourceSubVariantId = 74, TargetSubVariantId = 75, DiffPerc = 60,DiffRec=30},
new TestOperationDifference { Id = 1, TestId = 100, SourceSubVariantId = 75, TargetSubVariantId = 76, DiffPerc = 80,DiffRec=30},
new TestOperationDifference { Id = 1, TestId = 100, SourceSubVariantId = 77, TargetSubVariantId = 78, DiffPerc = 100,DiffRec=30 },
new TestOperationDifference { Id = 1, TestId = 101, SourceSubVariantId = 77, TargetSubVariantId = 78, DiffPerc = 100,DiffRec=30 },
foreach (var c in testOperationDifferences)
c.Test = tests.First(e => e.Id == c.TestId);
c.Test.TestOperationDifference.Add(c);
c.SubVariants = subVariants.First(e => e.Id == c.SourceSubVariantId);
c.SubVariants.TestOperationDifference.Add(c);
c.SubVariants1 = subVariants.First(e => e.Id == c.TargetSubVariantId);
c.SubVariants1.TestOperationDifference1.Add(c);
SubVariants = subVariants,
TestOperation = testOperations,
TestOperationDifference = testOperationDifferences,
from to in context.TestOperation
group to by to.SubVariants.Variants.Name into testOpByVariantName
select new OutputVariants
ParentVariantName = testOpByVariantName.Key,
(from to in testOpByVariantName
group to by to.Test into testOpByTest
let test = testOpByTest.Key
select new SubVariantsList
SourceSubVariant = to.SubVariants.Name,
TargetSubVariant = to.SubVariants1.Name,
var result = query.ToList();
foreach (var o in result)
Console.WriteLine("{0}", o.ParentVariantName);
foreach (var t in o.TestList)
Console.WriteLine("\t{0} {1}", t.TestId, t.Version);
foreach (var sv in t.SubVariantsList)
Console.WriteLine("\t\t{0} {1} {2}", sv.SourceSubVariant, sv.TargetSubVariant, sv.DiffPerc);