首页 > 解决方案 > 我将如何创建一个包含来自 selectmany 方法的父数据和子数据的视图模型

问题描述

public class Reservation {

    public Guid ReservationId { get; set; }
    public string Date { get; set; }

}
public class Passenger {

    public int Id { get; set; }
    public Guid ReservationId { get; set; }
    public string Lastname { get; set; }
    public bool IsCheckedIn { get; set; }

}
public class PassengerViewModel {

    public string Date { get; set; }
    public IEnumerable<Passenger> Passengers { get; set; }

}
public class ManifestController : ControllerBase {

    [HttpGet("date/{date}")]

    public IQueryable<PassengerViewModel> Get(string date) {
        var passengers = context.Reservations
            .Where(x => x.Date == date)
            .SelectMany(p => p.Passengers.Select(x => new PassengerViewModel {
                Date = p.Date,
                Passengers = p.Passengers.Where(x => x.IsCheckedIn)
            }));
        return passengers;
    }

}

规格:

  1. PassengerViewModel 应该只包含一条记录
  2. 基于作为输入的日期字段,查询查找所有登记的乘客并创建视图模型。
  3. 输出应该是这样的:

日期:2021-05-01

乘客:史密斯琼斯布朗

我不知道这是否可能,也许我要求太多了!

标签: c#entity-frameworklinq.net-coreentity-framework-core

解决方案


首先你必须修复乘客类

public class Passenger {

    public int Id { get; set; }

    public Guid ReservationId { get; set; }
    public virtual Reservation Reservation { get; set; }

    public string Lastname { get; set; }
    public bool IsCheckedIn { get; set; }

}

我认为不可能查询它,因为您的视图模型 passangers 不可查询,只能查询 IEnumerable

public PassengerViewModel Get(string date)
{
 return new PassangerVievModel {
           Data=date,
           Passangers= context.Passengers
            .Where(x => x.IsCheckedIn &&  x.Reservation.Date == date)
            .ToList()
             };
}

如果您删除 .ToList() Passangers 将是可查询的,但是您将遇到语法错误。你必须问你的老师什么是可查询的。但是我认为它没有任何意义,因为您没有任何谓词。

或者,如果您只需要乘客姓名列表,则必须更改视图模型

public class PassengerViewModel {

    public string Date { get; set; }
    public IEnumerable<string> Passengers { get; set; }

}

并查询

return new PassangerVievModel {
           Data=date,
           Passangers= context.Passengers
            .Where(x => x.IsCheckedIn &&  x.Reservation.Date == date)
            .Select(i=> i.Lastname)
            .ToArray()
             };

推荐阅读