У меня есть две таблицы:
Автомобили
- carId (int) primary
- carName (varchar)
- carRegisterDate (дата)
Фотографии
- photoId (int)
- photoCarId (int) // внешний ключ от cardId в Cars
- photoSortId (int) // сортировка фотографий по значению int
- photoIsMain (bool) // определяет, является ли это главное фото
- photoName (varchar)
Моя цель:
Выполните запрос в Автомобили, запрашивая n записей
Выполните подзапрос к таблице фотографий, у которой есть внешний ключ, связанный с таблицей автомобилей. В этом запросе мне нужно:
- сортировка по полю 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);
}
}
Есть ли более подходящий подход?