在我的 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()
是否会触发客户端评估?
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()**