【发布时间】:2020-05-30 22:47:41
【问题描述】:
我有这两个模型:
public class Seat
{
public int Id { get; set; }
public ICollection<Reservation> Reservations { get; set; }
//..
}
public class Reservation
{
public int Id { get; set; }
public int SeatId { get; set; }
public Seat Seat { get; set; }
public DateTime DateTime { get; set; }
//..
}
假设一个座位在一周中的每一天都有预订。我想进行查询,以获取座位并过滤请求日期的座位预订。我想显示座位并显示 X 天免费/保留的座位。 我尝试实现它的方式:
var seats = _dbContext.Seats
.Include(s => s.Reservations.Where(r => r.DateTime.Date == dateParam.Date));
// InvalidOperationException: 'Lambda expression used
// inside Include is not valid.'
样本
var seats = _dbContext.Seats
.Include(s => s.Reservations)
.Where(r => r.Reservations.Any(r => r.DateTime.Date == dateParam.Date));
// Gets the seats which meet the condition. I want these, but also I want the free seats
样本
var seatsFiltered = _dbContext.Seats
.Include(t => t.Reservations)
.Where(r => r.Reservations.Any(r => r.DateTime.Date == dateParam.Date))
.ToList();
var seats = _dbContext.Seats
.ToList()
.Select(x => { x.Reservations = new List<Reservation>(); return x; })
.Concat(seatsFiltered);
// Not optimal since I obviously ToList twice
// In the end I get an empty list
return (ICollection<Seat>)seats;
编辑:按要求添加示例数据:
座位
Id|AreaId|
--|------|
1|3 |
2|3 |
3|3 |
4|3 |
5|3 |
6|3 |
7|3 |
8|3 |
预订
Id|SeatId|Name|Phone|DateTime |
--|------|----|-----|-------------------|
7| 1| | |2020-02-15 20:30:00|
8| 1| | |2020-02-21 12:00:00|
9| 1| | |2020-02-23 09:00:00|
10| 2| | |2020-02-15 20:30:00|
11| 2| | |2020-02-21 12:00:00|
12| 2| | |2020-02-23 09:00:00|
13| 4| | |2020-02-21 12:00:00|
15| 7| | |2020-02-15 20:30:00|
16| 7| | |2020-02-21 12:00:00|
17| 8| | |2020-02-21 12:00:00|
14| 8| | |2020-02-23 09:00:00|
18| 3| | |2020-02-15 20:30:00|
19| 3| | |2020-02-21 12:00:00|
20| 3| | |2020-02-23 09:00:00|
当我尝试 Phong 的代码时,出现以下错误:
System.InvalidOperationException: 'LINQ 表达式'(GroupByShaperExpression: KeySelector: (r.SeatId), 元素选择器:(实体形状表达式: 实体类型:预订 值缓冲区表达式: (ProjectionBindingExpression:EmptyProjectionMember) IsNullable: 假 ) ) .ToList()' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。'
【问题讨论】:
-
能否请您提供您的样本数据以及相应的结果?
-
此外,
Reservation不应包含Seat对象。它已经包含SeatId以便能够参考。 -
好的
Seat可能是多余的,我刚刚遵循了有关建立关系的指南。 2020-02-15 的结果将返回所有座位,包括DateTime值为2020-02-15 20:30:00的预订,因为这是我用作示例的座位。
标签: .net entity-framework linq .net-core entity-framework-core