C# LINQ似乎在映射过程中忽略了Where子句的一部分(可能是由于ICollection问题)

C# LINQ似乎在映射过程中忽略了Where子句的一部分(可能是由于ICollection问题),c#,linq,mapping,C#,Linq,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 A

让我使用此示例数据来更清楚地说明我的问题:

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; }
奇怪的是,结果是该
地址(每行)的
预订的所有小时数之和。
这意味着date子句似乎被完全忽略了

我的大脑不知道问题是什么,但我猜这与我从
Booking->Address->Bookings
开始比较值有关。 但就数据库而言,这是正常的,因为每个
预订
都有一个唯一的
地址ID
,但每个
地址
可以与许多
预订
相关,并且在给定日期内可以存在多个
预订


我希望我的问题是清楚的,我提供了足够的信息。如果有人还需要什么,请随时告诉我。

我找到了问题的解决方案,请回答我的问题:

原因是这个表达被错误地解释了。特别是

.Where(b => b.Datum.Value == e.Datum.Value)
部分被混淆了,并且在由b和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)存在某种缺陷


干杯

对于健全性检查,在调用映射的地方,是否也可以运行
address.Bookings.where(b=>b.Datum.Value==e.Datum.Value)。求和(b=>b.Hours)
并检查该值?我犯了一个错误,那就是数据可能不是你想象的那样。或者AutoMapper以某种方式操纵表达式,但这不会是因为在SQL Management Studio中运行(等效)查询“证明”日期比较不起作用。简单地说,在每一行中,我都会得到这个查询的结果:从AddressID=12345的预订中选择SUM(Hours),而不是从AddressID=12345和Date=2016-04-12 00:00:00.000的预订中选择SUM(Hours),但可能日期确实匹配:)这就是为什么我对忽略AutoMapper的结果感兴趣,因为LINQ通常不会从它的链中删除方法:)。等效的SQL查询将是
在Booking.AddressId=Address.ID WHERE Booking.Date=Address.Date
上从Booking内部连接地址选择SUM(HOURS)我有点困惑,或者我没有正确解释某些内容。。。但e.Date是预订行的日期,而不是地址的日期。因此,基本上,对于每一个预订行,我都会尝试获取在同一日期存在的相关地址的所有预订…以及该行的预订*如果可以理解的话,这些预订应该包括这一行的预订。让我们来看看。
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))