【发布时间】:2016-08-04 17:16:52
【问题描述】:
我正在尝试使用 linq 从字段 LocationId 为值或为空的视图中获取项目列表。字段 LocationId 是 int?。
我正在尝试的代码是这样的:
var items = _context.Items.Where(
d => d.LocationId == null || d.LocationId == query.Location).ToList();
不幸的是,从 SqlProfiler 中可以看出,生成的 sql 不包含 d.LocationId == null。
与可能的重复问题不同的是,那里只检查一个值是空的。我想要的是 SELECT * FROM Items WHERE LocationId = @some_param OR LocationId IS NULL 行中的某处。
编辑:在映射不正确的 cmets 之后,我发现了问题。 映射类似于
HasKey(x => new { x.EquipmentId, x.LocationId});
因为这一切都来自一个视图。 似乎如果 LINQ 将属性视为键的一部分,它将假定它是不可为空的,无论该属性是否可以为空(int?)
【问题讨论】:
-
您看到生成了什么 SQL?
-
什么是
query.Location,也是Nullable<int>或int? -
LocationId可以为空吗?即它是 int 吗? -
生成的sql只包含Where LocationId = @p0。没有什么是空的。
-
@Ndy 显然您的实体模型/映射有问题,导致 EF 假定您的
LocationId列不可为空,因此在生成 SQL 查询时删除了该条件。使用您的实体类和配置更新问题。
标签: c# entity-framework linq null