DB4o Linq查询 - 如何检查空字符串

3
嗨,这是一个简单的查询:
var q = (from SomeObject o in container
    where 
 o.SomeInt > 8 
 && o.SomeString != null //Null Ref here
    select o;

我总是遇到空引用异常。

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

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

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

谢谢, Dave

1个回答

3

实际上,您的查询应该可以正常工作,不会有任何问题。您的查询应该能够正常运行,也不需要任何激活。db4o试图将查询转换为SODA-Queries并避免激活对象。

您正在使用哪个版本的db4o?曾经有一个错误会导致LINQ-Queries出现NullRefrence异常。它应该已经被修复了。

您是否已将Db4objects.Db4o.Linq.dll程序集添加到项目中?mono程序集是否存在?

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


嘿,谢谢你的回复,你在Db4o方面非常有帮助。我很感激。我刚刚将所有DLL升级到最新版本,现在查询可以运行了 - 但是我的索引都不起作用了。叹气我已经启用了控制台日志记录,但是我没有收到任何关于缺失索引的消息(就像你在我之前的帖子中帮助过我的那样)。有什么想法吗?:(谢谢, 戴夫 - Dave Bish
嗯,这很奇怪。你在Visual Studio的输出窗口中是否看到了任何新的“Db4objects.Db4o.Linq.QueryOptimizationException”?那可能意味着查询没有进行优化。请检查一下,如果你切换到了8.0 beta版本,确保你有'Mono.Reflection.dll'与'Db4objects.Db4o.Linq.dll'程序集一起。这是一个新的依赖项,而不是Cecil组件。总之,这很奇怪,应该进行调查。 - Gamlor
我之前使用的是最新的v7 Dll文件。现在我已经升级到beta版本,一切似乎都正常了。再次感谢您的帮助。 Dave - Dave Bish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接