entity-framework-core - EF Core 完全忽略了我在选择中选择的属性
问题描述
据我了解,以下代码应生成一个仅包含RouteId
、RouteNo
和ShipId
var tow = (from t in _context.AllTowData
where t.RouteId == id
orderby t.RouteNo descending
select new TowDefaults {
Id = t.RouteId,
TowNo = t.RouteNo,
ShipId = t.ShipId,
LastTow = t.RouteNo
})
.FirstOrDefault();
但是,我得到:
SELECT v.route_id, v.route_no, v.tow_id, v.analysis_complete, v.checks_complete, v.cpr_id, v.date_created, v.date_last_modified, v.factor, v.fromportname, v.instrument_data_file, v.instrument_id, v.internal_number, v.mastername, v.message, v.miles_per_division, v.month, v.number_of_samples, v.number_of_samples_analysed_fully, v.prop_setting, v.route_status, v.sampled_mileage, v.serial_no_per_calendar_month, v.ship_speed, v.silk_reading_end, v.silk_reading_start, v.toportname, v.tow_mileage, v.validity, v.year
FROM view_all_tow_data AS v
WHERE v.route_id = '@__id_0'
ORDER BY v.route_no DESC
LIMIT 1
这是除了明确要求的每一列ShipId
!我究竟做错了什么?
使用 SQL Server 和 PostGres 数据库会发生这种情况
解决方案
该属性ShipId
未通过[NotMapped]
注释或映射指令映射。就EF而言,该属性不存在。这有两个效果:
- EF“注意到” final 有一个未知部分
Select
,它切换到客户端评估(因为它是 finalSelect
)。这意味着:它将查询之前的查询转换Select
为不包含该ShipId
列的 SQL,执行它,并实现完整的AllTowData
实体。 - 它评估
Select
客户端并返回具有默认值的请求TowDefaults
对象ShipId
,或您在 C# 代码中初始化的任何值,但数据库中没有任何值。
您可以通过在查询后检查来验证这一点_context.AllTowData.Local
:它将包含所有AllTowData
通过过滤器的实体。
从你的问题不可能告诉你应该做什么。也许您可以将属性映射到视图中的列。如果没有,您应该将其从 LINQ 查询中删除。在 LINQ 的任何地方但在 final 中使用它Select
会导致运行时异常。