EntityFramework Core получает несколько результатов после объединения - PullRequest
1 голос
/ 17 января 2020

В базе есть таблицы станков, колес, характеристик. 1 запись автомобиля включает в себя 4 записи колеса и несколько характеристик. В базе данных это выглядит примерно так: enter image description here

Я хочу получить последние 5 записей об автомобилях, включая полный набор данных параметров и информацию о колесах. И я хотел бы получить все данные в одном запросе.

 var result = (from Machines in db.Machines.Where(x => x.param == 2) orderby Machines.ID descending
                      join wheel in db.Wheels on Machines.ID equals wheel.MachineId
                      join param in db.Characteristcs on Machines.ID equals param.MachineId
                      select new { Machines, param, wheel } 
                      ).Take(5).ToList();

, но он возвращает только одну запись колеса и одну характеристику c.

Ответы [ 3 ]

2 голосов
/ 18 января 2020
  1. На SQL сервере создайте отношения машины с таблицами колес и характеристик c.
  2. Перезапустите scaffolding-dbcontext, чтобы обновить ваш EF dbcontext и модели
  3. Использование Включить linq. var result = db.Machines.Where (x => x.Id == 2) .Include (x => x.Wheels) .Include (x => x.Характеристики);

Смотрите скриншот

1 голос
/ 20 января 2020

В EF Core вы можете обратиться к отношениям и для загрузки полученных данных для получения более подробной информации.

Вот мое рабочее демо:

Модель

public class Machines
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string Color { get; set; }
    public int Weight { get; set; }
    public int Param { get; set; }
}
public class Characteristics
{
    public int Id { get; set; }
    public string Parameter { get; set; }
    public string Value { get; set; }
    public string Description { get; set; }

    public int MachineId { get; set; }
}
public class Wheels
{
    public int Id { get; set; }
    public int Radius { get; set; }
    public int Weight { get; set; }
    public int MachineId { get; set; }
}

Контроллер

public IActionResult GetCars()
{
        var collection = (from Machines in _context.Machines.Where(x => x.Param == 2)
                      join wheel in _context.Wheels on Machines.Id equals wheel.MachineId
                      join param in _context.Characteristics on Machines.Id equals param.MachineId
                      select new { Machines, param, wheel }
                  ).ToList();

        //get the last 5 entries about cars
        var result= collection.Skip(Math.Max(0, collection.Count() - 5)).ToList();
        return new JsonResult(result);
}
1 голос
/ 17 января 2020

Я думаю, вы должны сначала увидеть, если ваша модель определила свойства навигации для нужных вам объектов:

public class Machine {

  public int ID {get;set;}
  //...
  //Navigation Properties
  public IList<Wheel> Wheels {get;set;}
  public IList<Charateristic> Charateristics {get;set;}

}

В этом случае ваш запрос будет:

var query= context.Machines.Include(m=> m.Wheels)
                           .Include(m=>m.Charateristics)
                           .Where(x => x.param == 2)
                           .Take(5)
                           .ToList();

Методы Include помогают создать запрос, извлекающий нужные данные из связанной таблицы.

Если вы не определили свойства навигации, что я настоятельно рекомендую, вы можете сделать группу присоединяется

var query=  from m in context.Machines
            join c in context.Charateristics on m.Id equals c.MachineId into gc
            join w in context.Wheels on m.Id equals w.MachineId into gw
            select new {Machine= m, Wheels= gw, Charateristics=gc };

var result= query.Take(5).ToList();
...