Запрос linq с подзапросом, возвращающим выбранные поля и отсортированным в обоих запросах - PullRequest
0 голосов
/ 29 августа 2018

У меня есть две таблицы:

Автомобили

  • carId (int) primary
  • carName (varchar)
  • carRegisterDate (дата)

Фотографии

  • photoId (int)
  • photoCarId (int) // внешний ключ от cardId в Cars
  • photoSortId (int) // сортировка фотографий по значению int
  • photoIsMain (bool) // определяет, является ли это главное фото
  • photoName (varchar)

Моя цель:

  1. Выполните запрос в Автомобили, запрашивая n записей

  2. Выполните подзапрос к таблице фотографий, у которой есть внешний ключ, связанный с таблицей автомобилей. В этом запросе мне нужно:

    • сортировка по полю PhotoSortId
    • получить photoName в отдельном поле, запись которого имеет поле photoIsMain == true
    • кол-во фотографий всего

В настоящее время я использую запрос в таблице автомобилей, возвращающий коллекцию и проходящий по ней, и для каждого элемента автомобиля я создаю запрос в таблице фотографий, упорядочивая поле photosSortId и проверяя, является ли поле photoIsMain истинным.

Я бы смог получить такие данные, сортировать поля только используя linq? Получу ли я более высокую производительность, если бы сделал это?

В настоящее время я делаю что-то вроде:

public class ListCars
{
    public int CarId { get; set; }
    public string CarName { get; set; }
    public DateTime CarRegisterDate { get; set; }
    public List<string> ListPhotos { get; set; }
    public string MainPhoto { get; set; }
    public int CarTotal { get; set; }
}

// First - query cars
var cars = await(from c in _db.Cars)
    select new ListCars
    {
     CarId = c.carId
     CarName = c.carName
     CarRegisterDate = c.carRegisterDate
    })
    .AsNoTracking().Take(9)
    .OrderByDescending(x => x.CarRegisterDate)
    .ToListAsync();

// Loop foreach car
foreach (var carItem in cars)
{
    //query photos
    var photos = await(from p in _db.Photos
                       where p.photoCarId == carItem.CarId
                       orderby p.photoSortId
                       select new { p.photoName, p.photoIsMain }).AsNoTracking().ToListAsync();

    //List for get
    cars.ListPhotos = new List<string>();

    foreach (var photoItem in photos)
    {
        //Count photos items
        carItem.CarTotal++;

        //check if is main
        if (photoItem.photoIsMain)
        {
            carItem.MainPhoto = p.photoName;
        }

        //Add photoName to list
        cars.ListPhotos.Add(p.photoName);
    }
}

Есть ли более подходящий подход?

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