【问题标题】:In-memory database filtering by null value not working按空值过滤的内存数据库不起作用
【发布时间】:2021-06-08 15:32:29
【问题描述】:

我有一段工作代码,我想用单元测试来介绍它。然而,微软的内存数据库返回了一些意想不到的值。

如果我这样查询

var count = query.Count(c => c.Birthday2000 != null);

结果是 0,虽然它应该是 12。

如果我这样查询

var count = query.ToList().Count(c => c.Birthday2000 != null);

结果是 12,这是预期的。

如果我用我的关系数据库 (mysql) 运行它,第一行也可以。

我有以下型号

public class Customer
{
    public DateTime? BirthDay {get; set; }
    private DateTime? _birthday2000;
    public DateTime? BirthDay2000 
    {
        get
        {
            if (BirthDay == null) _birthday2000 = null;
            else _birthday2000 = new DateTime(2000, BirthDay.Value.Month, BirthDay.Value.Day);
            return _birthday2000;
        }
        set => _birthday2000 = value;
    }
}

什么可能导致这个问题?

我的目标是查询数据库中接下来的 n 个生日。我无法订购和过滤 BirthDay,因为年份部分不同,这就是为什么我引入了 BirthDay2000 属性,其中年份设置为修复年份。

当我通过网络服务接收新客户时,我使用自定义 g/setter 自动设置它。

【问题讨论】:

  • 当你使用 .ToList() 时,它会一直执行查询,所以query.ToList() 将返回所有记录,然后它们将被计算在内。至于为什么Count(...)不起作用,你的BirthDay2000实现很“复杂”,数据库本身无法完成,必须在本地完成。
  • Customer 型号有手动配置吗?
  • 正如@atiyar 所说,它可能来自配置,并且在相同的特定情况下,EntityFramework 将生成“1:1”查询,因为他知道条件永远不会达到(例如,如果它相信date 永远不能为空)...但是我对内存数据库stackoverflow.com/questions/1264681/… 的行为知之甚少

标签: c# entity-framework-core in-memory-database


【解决方案1】:

您的BirthDay2000 不仅在将 EF.Core 映射到任何类型的数据库(ORM 使用数据对象,而不是逻辑对象)方面无效,而且就一般属性而言,它也是相当无效的:您的吸气剂有副作用。

【讨论】:

  • 我想要实现的是根据 BirthDay 的值自动设置 BirthDay2000 属性。我编辑了我最初的帖子,以便更清楚地说明原因。
  • 为什么不重要,你做错了。如果你想要依赖属性,那么使用已经制作的东西,比如 OAPH。如果您想自己编写代码,那很好,但不要写入 getter 中的变量。如果您想使用 EF.Core,请将您的 Dto 与您的逻辑层分开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多