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))
奇怪的是,结果是此 Address
的 Bookings
的所有小时的总和(对于每一行)。
这意味着日期子句似乎被完全忽略了。
我的大脑无法理解问题所在,但我猜这与我从 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)
干杯!
让我使用这个示例数据来使我的问题更清楚:
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))
奇怪的是,结果是此 Address
的 Bookings
的所有小时的总和(对于每一行)。
这意味着日期子句似乎被完全忽略了。
我的大脑无法理解问题所在,但我猜这与我从 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)
干杯!