使用 SQLite 数据库在 LINQ 查询中比较小数,使用运算符会失败,但可以使用 .CompareTo

问题描述 投票:0回答:1

在我的 SQLite 数据库中,我有一个表

foo
,其中包含数据类型为
bar
的列
decimal
。我想检索所有行,其中
bar
的值为
> 100

如果我尝试像这样执行查询:

var result = from r in db.Foo
             where r.Bar > 100
             select Bar;

我收到以下错误:

The LINQ expression 'DbSet<Foo>.Where(r => r.Bar > 100)' could not be translated. 

Either rewrite the query in a form that can be translated, 
or switch to client evaluation explicitly by inserting a call to either 
AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). 
See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

但是,如果我重写查询以使用

.CompareTo()
而不是
>
,则它可以正常工作:

var result = from r in db.Foo
             where r.Bar.CompareTo(100) > 0
             select r;

我不太明白为什么第一个查询有效,但第二个查询却不起作用,因为它们基本上做了相同的事情。

.CompareTo()
是否会触发客户端评估?

c# .net sqlite entity-framework entity-framework-core
1个回答
-1
投票

Linq 查询中使用的“>”运算符在数据库中未正确翻译。 EF 无法将某些操作转换为 SQL。但是“CompareTo()”是一个可以很容易被EF翻译的过程。因此它有效。

您还可以使用下面的示例获得结果。

**var result = db.Foo.Where(r => r.Bar > 100).AsEnumerable();** 

如果你想用linq格式编写,可以尝试

r.Bar.Value

另一个例子是在检索到 riler 后在客户端提供控制。您可以检查下面的示例。

 **from r in db.Foo.AsEnumerable()**
© www.soinside.com 2019 - 2024. All rights reserved.