首页 > 解决方案 > 使用返回选定字段并在两个查询中排序的子查询查询 linq

问题描述

我有两张桌子:

汽车

相片

我的目标是:

  1. 在 Cars 中执行查询,查询 n 条记录

  2. 对具有链接到汽车表的外键的照片表执行子查询。在这个查询中,我需要:

    • 按 photoSortId 字段排序
    • 在记录具有字段 photoIsMain == true 的单独字段中获取 photoName
    • 计算照片项目总数

目前我正在使用汽车表中的查询返回一个集合并循环遍历它,并且对于每个汽车项目,我在照片表中创建一个查询,通过 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);
    }
}

有没有更合适的方法?

标签: c#sql-serverentity-frameworklinq-to-entities

解决方案


推荐阅读