将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项。