来自实体框架投影的投影中的枚举 (Select
)是一个已知问题。如果你这样做
_entities.Price.Where(p => p.StatusCode.Equals("A") &&
p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
p.Route.RouteCode.Equals(routeName)).ToList() // ToList !
.Select(p => new Trade ...
投影是通过常规的 linq-to-objects 完成的,这是一项例行工作。
EDIT
事后我想补充一点,这只是一个愚蠢的想法ToList()
当相关表有很多列时可能会产生不利影响。这意味着传输给客户端的数据远多于必要的数据。在这种情况下,执行以下操作可能会很有用双投影。首先,在查询提供程序项目的范围内接受类型。然后,切换到 linq-to-objects 后(AsEnumerable
) 投影到最终类型:
_entities.Price.Where(p => p.StatusCode.Equals("A") &&
p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
p.Route.RouteCode.Equals(routeName))
.Select(p => new
{
Volume = (long) (p.Volume ?? 100),
PriceTypeCode = p.PriceTypeCode,
Price = p.Price1,
TenorStartDate = p.Period.PeriodStartDate.Value,
TenorEndDate = p.Period.PeriodStartDate.Value,
TradeId = p.ID
})
.AsEnumerable()
.Select(x => new Trade
{
Volume = x.Volume,
TradeType = (x.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder),
Price = x.Price1,
TenorStartDate = x.TenorStartDate,
TenorEndDate = x.TenorEndDate,
TradeId = x.ID
}).