Как получить данные, используя минимальное количество запросов? - PullRequest
0 голосов
/ 30 января 2019

Вот пример таблицы и пример класса

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

Class foo {
    Int Name
    Int Value1
    Int Value2
}

Итак, как написать запрос, который должен извлекать только те строки, для которых параметр имеет значение P1 или P2 (есть дополнительные значения для параметра, не показаныв образце)?Кроме того, запрос должен создать список объектов foo с (в данном примере) двумя экземплярами класса foo (по одному для каждого отдельного значения Name).

  • foo: Имя = A1, Значение1 = X, Значение2 = Y
  • foo: Имя = A2, Значение1 = XX, Значение2 = YY

Сгенерированный список также должен быть заказан Value1.

Заранее спасибо.

PV

Ответы [ 2 ]

0 голосов
/ 30 января 2019
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);
0 голосов
/ 30 января 2019

Я попробовал, как показано ниже: Создан фиктивный класс для ввода-данных:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...