带负值的表达式返回不正确的结果

时间:2018-01-03 18:40:10

标签: c# sqlite ef-core-2.0

将SQLite用作EFCore的数据库时,以下表达式不起作用:

Where(x => x.Price > -1)

此表达式将返回Price为-5的项目。一种解决方法是使用Decimal.Negate并反转表达式,但不应该这样做。使用SQL作为数据库时,这两种方法都可以正常工作我错过了什么,或者这真的是SQLite的错误吗?

下面的Repro:

鉴于Db模型项目

class Item
{
    public long Id { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set; }
}

和db context

class TestDbContext : DbContext
{
    public TestDbContext(DbContextOptions options) : base(options) { }

    public DbSet<Item> Items { get; set; }
}

以及以下回购:

static async Task Main()
{
    var connection = new SqliteConnection("DataSource=:memory:");

    connection.Open();

    var options = new DbContextOptionsBuilder<TestDbContext>()
                        .UseSqlite(connection)
                        .Options;

    var context = new TestDbContext(options);

    context.Database.EnsureCreated();

    var items = new List<Item>
    {
        new Item{Id = 1, Name = "Item 1", Price = 100},
        new Item{Id = 2, Name = "Item 2", Price = 10},
        new Item{Id = 3, Name = "Item 3", Price = 0},
        new Item{Id = 4, Name = "Item 4", Price = -1},
        new Item{Id = 5, Name = "Item 5", Price = -5}
    };

    context.Items.AddRange(items);
    context.SaveChanges();

    var query1 = context.Items.Where(x => x.Price > 0).Select(x => x.Name);
    var results1 = await query1.ToArrayAsync();
    Console.WriteLine($"Items with price greater than 0 - {string.Join(',', results1)}");

    var query2 = context.Items.Where(x => x.Price > -1m).Select(x => x.Name);
    var results2 = await query2.ToArrayAsync();
    Console.WriteLine($"Items with price greater than -1 - {string.Join(',', results2)}");

    var query3 = context.Items.Where(x => decimal.Negate(x.Price) < 1).Select(x => x.Name);
    var results3 = await query3.ToArrayAsync();
    Console.WriteLine($"Items with price greater than -1 - {string.Join(',', results3)}");

    Console.ReadLine();
}

query2的结果产生第1,2,3和5项,其中只有第1,2,3项。

0 个答案:

没有答案