Хоган уже ответил, что вам нужно использовать join: Например, вот так:
var daysForSymbolS1 = from s in database.Cast<Symbol>()
join t in database.Cast<TradingDay>() on s equals t.SymbolGlobal
where (s.SymbolGlobal == "IBM" && t.Date == new DateTime(2010, 10, 20))
select new
{
s.SymbolGlobal,
t.Date,
t.Meta
};
Теперь перейдем к db4o-parts.Вы можете просто использовать саму ссылку для объединения.Вам не нужно никакого удостоверения личности (как показано выше)
Однако здесь нет большой проблемы.В настоящее время реализация LINQ to db4o вообще не поддерживает LINQ-оператор (вы можете убедиться в этом, воспользовавшись декларацией перехода к соединению).Это означает, что он возвращается к LINQ to Objects.Это означает, что все объекты загружаются в память, а затем выполняется LINQ to Object для этих объектов.Это очень медленно.
В настоящее время запрос не может быть эффективно выполнен на db4o.То, как вы обычно делаете такие вещи с помощью db4o, - это создание Day-collection для Symbol.Эта коллекция всегда содержит все дни этого символа.Затем вы можете запросить символ и затем получить данные.
Другим методом будет разделение запроса:
var ibmSymbols = from Symbol s in database
where s.SymbolGlobal == "IBM"
select s;
// run the TradingDay selection with the optimized LINQ to db4o implementation
// do the rest with LINQ to objects
var allSymbols = ibmSymbols.SelectMany(s => from TradingDay t in database
where t.SymbolGlobal==s && t.Date == new DateTime(2010, 10, 20)
select t);
Редактировать: я просто хочу добавить случай, когда символ имеетТорговые дни в списке другой коллекции.Тогда вы можете сделать это:
var ibmSymbols = from Symbol s in database
where s.SymbolGlobal == "IBM"
select s;
var tradingDays = from symbol in ibmSymbols
from day in symbol.TradingDays
where day.Date == new DateTime(2010, 10, 20)
select day;