【发布时间】: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