c# - I可查询。比较运算符(== 和 >=)的细节

标签 c# linq sqlite linq-to-sql iqueryable

在使用 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 中的比较是正确的?

enter image description here

最佳答案

您的数据库设置为与本地计算机不同的时区,这就是为什么由数据库执行的计算与在您的计算机上执行的计算不同的原因。

关于c# - I可查询。比较运算符(== 和 >=)的细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602531/

相关文章:

c# - For 循环和 DateTime 问题

c# - 将 List<int> 拆分为连续数字组

c# - Linq如何获取主记录和内部明细记录的特定字段

SQL 查询、多个左连接的 Group_Concat 和嵌套查询

datetime - 如何将日期时间数据导入到sqlite3?

c# - Entity Framework : When to use Set<>

c# - 使用 SharpZipLib 解压 .tar.gz

c# - Azure 服务管理 Api 配置更改(400 错误请求错误)

php - 的意思 ?在 SQLite 中标记

c# - 在 foreach 循环中跳过多个值