LINQ 似乎在映射期间忽略了部分 Where 子句(可能是由于 ICollection 问题)

LINQ seems to ignore part of Where clause (probably due to ICollection issue) during Mapping

让我使用这个示例数据来使我的问题更清楚:

public class Booking

public override int Id { get; set; }
public int? AddressId { get; set; }
public virtual Address Adress { get; set; }
public DateTime? Date { get; set; }
public decimal? Hours { get; set; }



public class Address

public override int Id { get; set; }
public ICollection<Booking> Bookings{ get; set; }

在将 Booking 映射到 ListItemDto 时尝试在 Linq 中执行以下操作时有这两个实体:

Mapper.CreateMap<Booking, MyListItemDto>()
    .ForMember(t  => t.HoursSum, 
              map => map.MapFrom(e => e.Address.Bookings
                          .Where(b => b.Datum.Value == e.Datum.Value)
                          .Sum(b => b.Hours))

奇怪的是,结果是此 AddressBookings 的所有小时的总和(对于每一行)。 这意味着日期子句似乎被完全忽略了。

我的大脑无法理解问题所在,但我猜这与我从 Booking -> Address-> Bookings 出发然后比较值的事实有关。 但是在数据库方面这是正常的,因为每个 Booking 都有一个唯一的 AddressId 但每个 Address 可以与许多 Bookings 相关,并且一个以上的 Booking 可以存在于一个给定日期。

我希望我的问题很清楚并且我提供了足够的信息。如果有人需要更多东西,请随时告诉我。

刚好回答我的问题,因为我找到了问题的解决方案:

原因是表达式解释错误。具体来说

.Where(b => b.Datum.Value == e.Datum.Value)

部分混淆了,在生成的查询中,b。和e。被视为相同的预订。 解决方案实际上是这样做的:

map => map.MapFrom(e => e.Address.Bookings
                      .Select(b => new {b.Datum, b.Hours})
                      .Where(b => b.Datum.Value == e.Datum.Value)
                      .Sum(b => b.Hours))

那(无论出于何种原因,我知道它看起来不太好)解决了问题并且表达式被转换为正确的查询。 我假设这是我们使用的 Automapper 版本的某种错误 (3.3)

干杯!