EF Core извлекает строки, сгруппированные по значению из столбца - PullRequest
0 голосов
/ 13 апреля 2020

Давайте, например, возьмем такую ​​таблицу (данные должны быть в одной таблице):

enter image description here

И я хочу получить результат JSON примерно так:

[
    {
        "manufacturer" : "VW",
        "cars" : [
            {
                "id" : 1,
                "model" : "Golf"
            },
            {
                "id" : 3,
                "model" : "Passat"
            },
            {
                "id" : 6,
                "model" : "Polo"
            }
        ]
    },
    {
        "manufacturer" : "Renault",
        "cars" : [
            {
                "id" : 2,
                "model" : "Laguna"
            },
            {
                "id" : 5,
                "model" : "Clio"
            }
        ]
    },
    {
        "manufacturer" : "Ford",
        "cars" : [
            {
                "id" : 4,
                "model" : "Fiesta"
            }
    }
]

Проблема в том, что, когда я пытаюсь получить производителей в отдельном списке, а затем l oop с foreach для получения данных, я получаю ошибку о Data Reader уже открыт.

var manufacturers = _context.Cars.Select(s=> s.Manufacturer).Distinct();

foreach(var m in manufacturers)
{
   var sublist = _context.Cars.Where(q=> String.Equals(q.Manufacturer, m).ToList();
   // Add sublist to the specified models field (list)
}

А у меня есть модель, в которой есть поле для производителя и список автомобилей.

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вы можете попробовать следующее,

var result = _context.Cars.GroupBy(x => x.Manufacturer).Select(x => new { manufacturer = x.Key, cars = x.Select(y => new { id = y.Id, model = y.Model }).ToList() }).ToList();
var json = JsonConvert.SerializeObject(result);

PS: AsNoTracking () можно использовать в сценарии только для чтения для гораздо более высокой производительности, такой как

_context.Cars.AsNoTracking()...

Для получения более подробной информации посетите здесь

1 голос
/ 13 апреля 2020

Во-первых, получите автомобили из базы данных с помощью:

               var carsList = context.Cars.ToList();

Таким образом, вы выполняете запрос к базе данных и получаете список всех объектов автомобилей в памяти, чтобы вы могли выполнить сложный запрос операции с этим списком.

В вашем случае:

            var list = carsList.GroupBy(x => x.Manufacturer).Select(x => new
            {
                manufacturer = x.Key,
                cars = x.Select(y=> new 
                {
                    id = y.Id,
                    model = y.Model
                })
            }).ToList();

Но если вы попытаетесь сделать этот запрос непосредственно в базе данных,

var list = context.Cars.GroupBy(x => x.Manufacturer).Select(x => new...

, если вы используете EF Core 3.0 и выше, у вас будет исключение во время выполнения оценки клиента и сервера, по умолчанию оно активировано в Ef Core 3.0.

Более подробная информация здесь:

https://docs.microsoft.com/en-us/ef/core/querying/client-eval

0 голосов
/ 13 апреля 2020

Вы можете попробовать:

manufacturers.Group(m=>m.manufacturer)

вы можете получить новую структуру данных, она содержит key(manufacturer) и value(List<cars>).

...