【问题标题】:Entity Framework Linq equals value or is null实体框架 Linq 等于值或为空
【发布时间】: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


【解决方案1】:

映射错误。从 HasKey 映射中移除 LocationId。

似乎如果 LINQ 将属性视为键的一部分,它将假定它是不可为空的,不管该属性是否可以为空(int?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多