2010-02-07 10 views

ответ

2

Может быть, вы столкнулись с ограничением 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)); 

Может быть представлен этим натриево-запроса:

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()) 
{ 
    // 
} 

Я надеюсь, что в будущих версиях Query-Optimizer поддерживает этот случай напрямую.

+0

Откуда «смешно»? –

+0

D'oh, копия и прошлая ошибка, я исправил ее. Исходный пример использовал «funny» как search-term;) – Gamlor

+0

кто вы Gamlor .. вы ответили на несколько вопросов Db4o, которые я опубликовал: D очень благодарен. Прежде чем вы отправили это сообщение, я действительно переместил свой код на запрос SODA, который сделал его 10000000x быстрее .. это была просто боль, полная перемещение к IList, а не IList <> .. В документе doc it stats Linq-запросы переводятся в SODA. Может быть, есть исправление для этой проблемы в переводе выражения. Может быть, посмотрите, могу ли я исправить это и внести некоторые изменения: D спасибо за помощь, которую ребята высоко ценят –