如何使用最少数量的查询来检索数据?

时间:2019-01-30 13:23:34

标签: c# sql entity-framework linq

这是示例表和示例类

Name    Parameter Value
A1       P1         X
A1       P2         Y
A2       P1         XX
A2       P2         YY

Class foo {
    Int Name
    Int Value1
    Int Value2
}

那么,如何编写一个查询,该查询仅应检索将Parameter设置为P1或P2的行(该示例中没有显示Parameter的其他值)?同样,查询应使用(在此示例中)2个foo类实例(每个不同的Name值一个实例)创建foo对象的List。

  • foo:名称= A1,值1 = X,值2 = Y
  • foo:名称= A2,值1 = XX,值2 = YY

生成的列表也应按Value1排序。

谢谢。

PV

2 个答案:

答案 0 :(得分:0)

我尝试如下: 为输入数据创建了一个虚拟类:

public class Test
{
    public string Name { get; set; }
    public string Parameter { get; set; }
    public string Value { get; set; }
}

在代码中,

 var inputData = new List<Test>
            {
                new Test{Name ="A1", Parameter="P1", Value="X"},
                new Test{Name ="A1", Parameter="P2", Value="Y"},
                new Test{Name ="A2", Parameter="P1", Value="XX"},
                new Test{Name ="A2", Parameter="P2", Value="YY"}
            };

            var groupedData = inputData.GroupBy(x => x.Parameter).ToList();
            var result = new List<foo>();
            foreach (var item in groupedData)
            {
                result.Add(new foo
                {
                    Name = item.FirstOrDefault().Name,
                    Value1 = item.FirstOrDefault().Value,
                    Value2 = item.Skip(1).FirstOrDefault().Value
                });
            }

输出为: As your expected output

答案 1 :(得分:0)

public class Table
{
    public string Name { get; set; }
    public string Parameter { get; set; }
    public string Value { get; set; }
}

public class foo
{
    public string Name { get; set; }
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

        var inputData = new List<Table>
        {
            new Table{Name ="A1", Parameter="P1", Value="X"},
            new Table{Name ="A1", Parameter="P2", Value="Y"},
            new Table{Name ="A1", Parameter="P3", Value="Z"},
            new Table{Name ="A2", Parameter="P1", Value="XX"},
            new Table{Name ="A2", Parameter="P2", Value="YY"},
            new Table{Name ="A2", Parameter="P3", Value="ZZ"},
        };

        var groupedData = inputData.Where(y => y.Parameter == "P1" || y.Parameter == "P2" ).GroupBy(x => x.Name).ToList();

        var result = new List<foo>();
        foreach (var item in groupedData)
        {
            result.Add(new foo
            {
                Name = item.FirstOrDefault().Name,
                Value1 = item.FirstOrDefault().Value,
                Value2 = item.Skip(1).FirstOrDefault().Value
            });
        }

        var result1 = result.OrderByDescending(x => x.Value1).ThenBy(x => x.Name);