Domanda
La seguente query richiede un po 'per tornare:
db.Query<Person>(x => x.StartsWith("Chr", StringComparison.CurrentCultureIgnoreCase))
c'è un modo per ottenere questo lavoro correttamente? vale a dire più veloce?
Soluzione
Forse è stato eseguito in una limitazione di di db4o query ottimizzazione . Normalmente query nativi e LINQ-query sono tradotti in un livello basso SODA-query . Quando questa ottimizzazione non riesce, db4o un'istanza gli oggetti nel database, al fine di eseguire la query. Come potete immaginare questo può essere piuttosto lento.
La migliore soluzione attuale è quella di utilizzare una soda direttamente per questo caso. Per esempio una classe con una proprietà:
public class SimpleObject
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
La query nativa in questo modo:
var result = db.Query<SimpleObject>(x => x.Name.StartsWith ("Chr",StringComparison.CurrentCultureIgnoreCase));
Può essere rappresentata da questo 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())
{
//
}
Spero che le future versioni del query-Optimizer supportano questo caso direttamente.
Altri suggerimenti
l'aggiunta e indice sulla colonna si sta confrontando potrebbe aiutare.