¿Cómo agrupar en 2 entidades secundarias y obtener el total de ambas entidades secundarias?

Quiero que se ejecuten variantes totales para mi Test Version 0 es decir Test Id=100

Esta es mi tabla y registros:

Prueba:

 Id Version 100 0 

Variantes:

 Id Name Type CategoryId 11 Variant1 Diff 2 12 Variant1 Add 2 13 Variant2 Add 3 14 Variant2 Diff 2 15 Variant3 Add 6 

Subvariantes :

 Id VariantId Name 66 11 Abc 67 11 PQR 68 11 Xyz 69 12 Abc 70 12 PQR 71 12 Xyz 72 13 Abc 73 13 PQR 74 14 Abc 75 14 PQR 76 14 Xyz 77 15 ABC 78 15 PQR 

TestOperation :

 Id TestId SourceSubVariantId TargetSubVariantId variation 1 100 69 70 0 1 100 70 71 20 1 100 72 73 90 

TestOperationDifference:

 Id TestId SourceSubVariantId TargetSubVariantId Unmatch 1 100 66 67 0 1 100 67 68 2 1 100 74 75 7 1 100 75 76 0 1 100 77 78 26 

Por lo tanto, de los registros anteriores hay un total de 3 variantes ejecutadas en 2 tipos de operación, es decir, TestOperation y TestOperationDifference y debajo están las 3 variantes para el Test 100 específico:

 Variants1(This run in TestOperation) Variants2(This run in TestOperation) Variants3(This run in TestOperationDifference) 

Estas 3 variantes parentales anteriores vendrán como debido a que todas estas variantes padre hijo se están utilizando en 2 tablas, es decir, TestOperation y TestOperationDifference.

Por lo tanto, para encontrar las variantes padre totales que necesito deducir de ambas tablas (TestOperation y TestOperationDifference), se usan las variantes secundarias correspondientes y, en base a eso, debo count total parent variants .

Esta es mi clase:

 public class Test { public int Id { get; set; } public string Version { get; set; } public virtual ICollection TestOperation { get; set; } public virtual ICollection TestOperationDifference { get; set; } } public class TestOperation { public int Id { get; set; } public Nullable TestId { get; set; } public int SourceSubVariantId { get; set; } public int TargetSubVariantId { get; set; } public int variation { 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 TestId { get; set; } public int SourceSubVariantId { get; set; } public int TargetSubVariantId { get; set; } public int unmatch { get; set; } public virtual SubVariants SubVariants { get; set; } public virtual SubVariants SubVariants1 { get; set; } public virtual Test Test { get; set; } } public class Variants { public int Id { get; set; } public string Name { get; set; } public string Type { get; set; } public int CategoryId { get; set; } public virtual ICollection SubVariants { get; set; } public virtual Category Category { get; set; } } public class SubVariants { 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 { get; set; } public virtual ICollection TestOperationDifference1 { get; set; } public virtual ICollection TestOperation { get; set; } public virtual ICollection TestOperation1 { get; set; } } 

Mi consulta:

 var data =(from mk in context.Test select new { TotalVariants = (mk.TestOperation.Select(t => t.SubVariants).Count() + mk.TestOperationDifference.Select(t => t.SubVariants).Count()) }).ToList(); 

Salida: 8

Salida esperada: 3

Actualizar

Ok Learning, aquí hay una solución …

 var tot_variants_for_test = (from v_name in (from t_op in test select new { v_name = t_op.TestOperation.Select(sv => sv.SubVariants.Variants.Name) } ).First().v_name select v_name) .Union( (from v_name in (from t_opdf in test select new { v_name = t_opdf.TestOperationDifference.Select(sv => sv.SubVariants.Variants.Name) } ).First().v_name select v_name)) .Count(); 

Desde lo alto de mi cabeza, asumiendo que entendí tu confusa descripción. Creo que debes TestOperation variantes de TestOperation y TestOperationDifference , luego distinguirlas y contarlas. No estoy seguro si esto funcionará en EF.

 let toQuery = context.Test.SelectMany(mk=>TestOperation.Select(t=>t.SubVariants.Variants)); let todQuery = context.Test.SelectMany(mk=>TestOperationDifference.Select(t=>t.SubVariants.Variants)); let total = toQuery.Concat(todQuery).Disctinct().Count; 

Además, tu nombre es confuso. Está utilizando plural (s) para referencias de elementos individuales y tiene SourceControlDetailId en su modelo que no está en la tabla y tiene SubVariants y SubVariants1 lugar de SourceSubVariant y TargetSubVariant . Yo recomendaría arreglar esto primero.

 from test in Tests where version == 0 let opsVariants = test.TestOperations .SelectMany(x => x.SourceSubVariant.Variant).Distinct() let diffsVariants = test.TestOperationDifferences .SelectMany(x => x.SourceSubVariant.Variant).Distinct() let variants = opsVariants.Union(diffsVariants) select variants.Count();