使用Linq2DB时遇到一个令人不快的问题-比较运算符==
和>=
无法正常工作。尽管操作员<=
可以正常工作。
最初,我认为问题出在Linq To SQLite中,因此在github上创建了问题。但是后来我在LinqToSql中发现了同样的问题。
我将从那里重复代码以演示问题:
类:
[Table(Name = "Records")]
public class Record
{
[Column(Name = "Date"), NotNull]
public DateTime Date { get; set; }
[Column(Name = "Value"), NotNull]
public decimal Value { get; set; }
public override string ToString()
{
return string.Format("{0} - {1}", Date, Value);
}
}
public class Db : LinqToDB.Data.DataConnection
{
public Db() : base("MyDatabase") { }
public ITable<Record> Records { get { return GetTable<Record>(); } }
}
测试查询:
var date = DateTime.ParseExact("14.01.2016", "dd.MM.yyyy", null);
Console.WriteLine("All:");
using (var db = new Db())
{
db.Records
.ToList()
.ForEach(Console.WriteLine);
}
Console.WriteLine("With Date >= {0}", date);
using (var db = new Db())
{
db.Records
.Where(x => x.Date >= date)
.ToList()
.ForEach(Console.WriteLine);
}
打印:
All:
01.01.2016 0:00:00 - 67
02.01.2016 0:00:00 - 75
03.01.2016 0:00:00 - 70
04.01.2016 0:00:00 - 81
07.01.2016 0:00:00 - 8
08.01.2016 0:00:00 - 27
11.01.2016 0:00:00 - 30
12.01.2016 0:00:00 - 68
13.01.2016 0:00:00 - 20
14.01.2016 0:00:00 - 34
15.01.2016 0:00:00 - 1
16.01.2016 0:00:00 - 66
With Date >= 14.01.2016 0:00:00
15.01.2016 0:00:00 - 1
16.01.2016 0:00:00 - 66
IEnumerable上的比较解决了这个问题:
Console.WriteLine("With Date >= {0}", date);
using (var db = new Db())
{
db.Records
.ToArray()
.Where(x => x.Date >= date)
.ToList()
.ForEach(Console.WriteLine);
}
打印:
...
With Date >= 14.01.2016 0:00:00
14.01.2016 0:00:00 - 34
15.01.2016 0:00:00 - 1
16.01.2016 0:00:00 - 66
所以问题是:这种行为的原因是什么?
编辑:
如果问题出在时差上,那么为什么在SQLite Manager中进行比较是正确的?
最佳答案
数据库设置为与本地计算机不同的时区,这就是为什么数据库执行的计算与在计算机上执行的计算不同的原因。
关于c# - 可查询的。比较运算符(==和> =)的细节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37602531/