如何按2个子实体分组,并获得这两个子实体的总数
本文关键字:实体 两个 2个 何按 | 更新日期: 2023-09-27 17:53:16
我想获得总变体为我的Test Version 0
即Test Id=100
运行
这是我的表和记录:
测试:
Id Version
100 0
变体:
Id Name Type CategoryId
11 Variant1 Diff 2
12 Variant1 Add 2
13 Variant2 Add 3
14 Variant2 Diff 2
15 Variant3 Add 6
SubVariants :
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
因此,从上述记录中,总共有3个变体在2种类型的操作上运行,即TestOperation
和TestOperationDifference
,以下是特定Test 100
的3个变体:
Variants1(This run in TestOperation)
Variants2(This run in TestOperation)
Variants3(This run in TestOperationDifference)
上述3个父变量将出现,因为所有这些父变量都在2个表中使用,即TestOperation和TestOperationDifference。
因此,为了找到总父变量,我需要从两个表(TestOperation和TestOperationDifference)中找出使用相应的子变量,并基于此,我需要count total parent variants
。
这是我的班级:
public class Test
{
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 class TestOperation
{
public int Id { get; set; }
public Nullable<int> 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<int> 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> 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> TestOperationDifference { get; set; }
public virtual ICollection<TestOperationDifference> TestOperationDifference1 { get; set; }
public virtual ICollection<TestOperation> TestOperation { get; set; }
public virtual ICollection<TestOperation> TestOperation1 { get; set; }
}
我查询: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();
输出:8
预期输出:3
更新
Ok Learning,这是一个解决方案…
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();
从我的脑海里,假设我理解你令人困惑的描述。我认为你需要联合TestOperation
和TestOperationDifference
的变体,然后区分并计数它们。
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;
还有,你的命名令人困惑。您正在使用复数(s)进行单项引用,并且您的模型中有SourceControlDetailId
,不在表中,并且有SubVariants
和SubVariants1
,而不是SourceSubVariant
和TargetSubVariant
。我建议先修复这个
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();