在使用 Linq2DB 时遇到了一个令人不快的问题 - 比较运算符 ==
和>=
无法正常工作。虽然运营商<=
工作正常。
起初我认为问题出在 Linq To SQLite 中,因此在 github 上创建了问题。但后来我发现 LinqToSql 也有同样的问题。
我将重复那里的代码来演示问题:
类(class):
[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# - I可查询。比较运算符(== 和 >=)的细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602531/