如何查询数据列表以使行成为列

ck *_*tey 5 linq

我有一个如下数据列表

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.

ReP*_*rre 2

我将欺骗 @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)

结果将如下所示:

编辑后的结果。