3

嘿那里 - 简单的查询:

var q = (from SomeObject o in container
    where 
 o.SomeInt > 8 
 && o.SomeString != null //Null Ref here
    select o;

我总是得到一个空引用异常。

如果我使用 String.IsNullOrEmpty(o.SomeString) 查询需要大约 100 倍的时间,就好像我使用 && o.SomeString != "" (这更快,但显然不正确)。

我猜是因为 DB4o 需要激活对象,以便将它们传递给 IsNullOrEmpty 调用,并且不能使用索引。

我的问题是,在这种情况下检查空值的更好方法是什么?有没有类似:mystring != Db4o.DBNull.Value 之类的?

干杯,戴夫

4

1 回答 1

3

实际上,您的查询应该没有任何问题。您的查询应该运行良好。它也不应该需要任何激活。db4o 尝试将查询转换为 SODA 查询并避免激活对象。

您使用的是哪个版本的 db4o?有一个错误导致 LINQ 查询中出现 NullRefrence-Exception。它应该被修复。

您是否已将 Db4objects.Db4o.Linq.dll 程序集添加到您的项目中。是否存在单组件?

目前我会尽量避免使用 String.IsNullOrEmpty,因为我会阻止查询优化。一旦您使用查询调用复杂的方法,优化器将无法将查询转换为 SODA。然后你基本上运行 LINQ to Objects,这在大型数据集上会很慢。

于 2010-06-17T12:29:50.857 回答