我将如何创建一个包含来自 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

乘客: 史密斯 琼斯 棕色

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

解决方法

首先你必须修复Passenger类

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()
             };

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...