Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 其中,具有负值的表达式返回不正确的结果_C#_Sqlite_Ef Core 2.0 - Fatal编程技术网

C# 其中,具有负值的表达式返回不正确的结果

C# 其中,具有负值的表达式返回不正确的结果,c#,sqlite,ef-core-2.0,C#,Sqlite,Ef Core 2.0,将SQLite用作EFCore的数据库时,以下表达式不起作用: Where(x => x.Price > -1) 此表达式将返回价格为-5的项目。一种解决方法是使用Decimal。对表达式进行求反和反转,但不需要这样做。使用SQL作为数据库时,这两种方法都可以很好地工作。我是否遗漏了什么,或者这真的是SQLite的一个bug 复制如下: 给定数据库模型项: class Item { public long Id { get; set; } public strin

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

Where(x => x.Price > -1)
此表达式将返回价格为-5的项目。一种解决方法是使用Decimal。对表达式进行求反和反转,但不需要这样做。使用SQL作为数据库时,这两种方法都可以很好地工作。我是否遗漏了什么,或者这真的是SQLite的一个bug

复制如下:

给定数据库模型

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

    public string Name { get; set; }

    public decimal Price { get; set; }
}
和数据库上下文

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

    public DbSet<Item> Items { get; set; }
}
类TestDbContext:DbContext
{
公共TestDbContext(DbContextOptions选项):基本(选项){}
公共数据库集项{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();
}
static async Task Main()
{
var connection=newsqliteconnection(“数据源=:内存:”);
connection.Open();
var options=new DbContextOptionsBuilder()
.UseSqlite(连接)
.选择;
var context=newtestdbcontext(选项);
context.Database.recreated();
var items=新列表
{
新项目{Id=1,Name=“项目1”,价格=100},
新项目{Id=2,Name=“项目2”,价格=10},
新项目{Id=3,Name=“项目3”,价格=0},
新项目{Id=4,Name=“项目4”,价格=-1},
新项目{Id=5,Name=“项目5”,价格=-5}
};
context.Items.AddRange(Items);
SaveChanges();
var query1=context.Items.Where(x=>x.Price>0)。选择(x=>x.Name);
var results1=等待query1.ToArrayAsync();
Console.WriteLine($”价格大于0的项目-{string.Join(',',results1)});
var query2=context.Items.Where(x=>x.Price>-1m)。选择(x=>x.Name);
var results2=await query2.ToArrayAsync();
Console.WriteLine($”价格大于-1-{string.Join(',',results2)}的项目);
var query3=context.Items.Where(x=>decimal.Negate(x.Price)<1)。选择(x=>x.Name);
var results3=await query3.ToArrayAsync();
Console.WriteLine($”价格大于-1-{string.Join(',',results3)}的项目);
Console.ReadLine();
}

查询2的结果生成项目1、2、3和5,其中仅预期项目1、2、3。

它不返回
项目4
,但返回
项目5
?这是一个多么奇怪的错误,请确保指定十进制?i、 e.
-1m
而不是
-1
@TyCobb您只是在示例中使用Linq to对象,而不是EFCore和SQLite。不,加上m没有任何区别。正确。除了一些可能测试你的情况的方法外,没有其他方法可以帮助任何人。只需要验证它不是无关的,并且您的第一行示例代码显示您没有使用decimal。