我有一个如下数据列表
Item Vendor Compliance Status
I1 V1 C1 Y
I1 V1 C2 N
I1 V1 C3 Y
I1 V2 C1 Y
I1 V2 C2 Y
I2 V1 C3 Y
Run Code Online (Sandbox Code Playgroud)
如何查询以使其成为
Item Vendor C1 C2 C3
I1 V1 Y N Y
I1 V2 Y Y -
I2 V1 - - Y
Run Code Online (Sandbox Code Playgroud)
虽然合规可能有很多,但没有必要只有C1,C2,C3.
我将欺骗 @Serv 并使用他用于定义数据的部分代码(叹息- 是的,我很懒)。
要处理dynamic具有许多合规性的方面,您可以使用ExpandoObject. 您需要做的就是获取所有现有的合规性类型,并为每种类型为您的对象分配一个属性。
void Main()
{
var content = new List<Content>()
{
new Content("I1", "V1", "C1", true),
new Content("I1", "V1", "C2", false),
new Content("I1", "V1", "C3", true),
new Content("I1", "V2", "C1", true),
new Content("I1", "V2", "C2", true),
new Content("I2", "V1", "C3", true),
new Content("I2", "V1", "C4", true)
};
var compliances = content.Select(c=>c.Compliance).Distinct();
var temp = content.GroupBy (c => new {Item = c.Item, Vendor = c.Vendor});
var results = temp.Select (t =>
{
dynamic result = new ExpandoObject();
result.Item = t.Key.Item;
result.Vendor = t.Key.Vendor;
foreach(var compliance in compliances)
{
var isCompliant = t.Any(x => x.Compliance == compliance && x.Status.GetValueOrDefault());
((IDictionary<String, Object>)result).Add(compliance, isCompliant);
}
return result;
}).Dump();
}
public class Content
{
public Content(string item, string vendor, string compliance, bool? status)
{
Item = item; Vendor = vendor; Compliance = compliance; Status = status;
}
public string Item { get; set; }
public string Vendor { get; set; }
public string Compliance { get; set; }
public bool? Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
结果:

编辑
要null代替false不存在合规性的情况,请使用以下代码循环foreach:
var isCompliant = t.FirstOrDefault(x => x.Compliance == compliance);
((IDictionary<String, Object>)result).Add(compliance, isCompliant == null ? null : isCompliant.Status);
Run Code Online (Sandbox Code Playgroud)
结果将如下所示:

| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |