【问题标题】:Db4o StartsWith and ignore caseDb4o StartsWith 并忽略大小写
【发布时间】:2010-02-07 13:35:45
【问题描述】:

以下查询需要一段时间才能返回:

db.Query<Person>(x => x.StartsWith("Chr", StringComparison.CurrentCultureIgnoreCase))

有没有办法让它正常工作?即更快?

【问题讨论】:

    标签: c# db4o


    【解决方案1】:

    也许您遇到了db4o’s query-optimization 的限制。通常本机查询和 LINQ 查询被转换为低级 SODA-query。当此优化失败时,db4o 实例化数据库中的对象以执行查询。可以想象,这可能会很慢。

    目前最好的解决方案是在这种情况下直接使用 SODA。例如具有一个属性的类:

     public class SimpleObject
     {
         private string name;
         public string Name
         {
             get { return name; }
            set { name = value; }
         }
     }
    

    这样的原生查询:

    var result = db.Query<SimpleObject>(x => x.Name.StartsWith ("Chr",StringComparison.CurrentCultureIgnoreCase));
    

    可以用这个 SODA-Query 表示:

    IQuery query = db.Query();
    query.Constrain(typeof (SimpleObject)); // restrict to a certain class
    query.Descend("name").Constrain("Chr").StartsWith(false); // the field 'name' starts with  'chr', case-insensitive
    
    foreach (var s in query.Execute())
    {
        // 
    }
    

    我希望查询优化器的未来版本直接支持这种情况。

    【讨论】:

    • “搞笑”从何而来?
    • D'oh,复制和过去的错误,我已经修复了。原始示例使用“有趣”作为搜索词 ;)
    • 你是谁 Gamlor.. 你已经回答了我发布的几个 Db4o 问题:D 非常感谢。在您发布此内容之前,我实际上将我的代码移动到 SODA 查询中,这使其速度提高了 10000000 倍。移动到 IList 而不是 IList 只是痛苦。在文档中,它统计 Linq 查询被翻译成 SODA 查询。也许在表达式翻译中有解决此问题的方法.. 可能会看看我是否可以修复它并提供一些方法:D 感谢您的帮助,非常感谢
    • LINQ 和 Native Query 通常都进入 SODA。对于 StartWith/EndWith 的 LIQ 实现,有一个可用的建议补丁。但它(尚未)集成到常规源中:developer.db4o.com/Forums/tabid/98/aff/4/aft/9669/afv/topic/…
    • 感谢您指出 Gamlor,我正在学习使用 Lucene 来完成我未来的所有全文搜索,这应该可以解决我当前的很多搜索问题
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多