db4o와 간단한 중첩 구조로 인해 까다로운 문제가 발생합니다.LINQ를 사용하여 db4o에서 중첩 클래스를 쿼리 하시겠습니까?
문제점 : LINQ를 사용하여 db4o에서 데이터를 가져올 때 너무 많은 데이터가 추출되는 경우 (즉, "where"절이 작동하지 않는 것처럼 보임).
Symbol sym1 = new Symbol("SPX");
Symbol sym2 = new Symbol("IBM");
그때 어떤 거래일 만들 :
// SPX
TradingDay day1 = new TradingDay(new DateTime(2010, 10, 18), "SPX meta");
TradingDay day2 = new TradingDay(new DateTime(2010, 10, 19), "SPX meta");
// IBM
TradingDay day3 = new TradingDay(new DateTime(2010, 10, 18), "IBM meta");
TradingDay day4 = new TradingDay(new DateTime(2010, 10, 19), "IBM meta");
그때 며칠을 할당
Root ----Symbol (SPX)
| |------Day 1: Date: 2010-10-18, string "SPX meta"
| |------Day 2: Date: 2010-10-19, string "SPX meta"
|
|
|-----Symbol (IBM)
|------Day 1: Date: 2010-10-18, string "IBM meta"
|------Day 2: Date: 2010-10-19, string "IBM meta"
내가 두 심볼을 만들 :
나는 몇 가지 중첩 된 개체가 각 기호에 :
sym1.AssignTradingDay(day1);
sym1.AssignTradingDay(day2);
sym2.AssignTradingDay(day3);
sym2.AssignTradingDay(day4);
나는 다음 db4o는 오브젝트 데이터베이스에 계속 :
// Store in the database.
db4o.db.Store(sym1);
db4o.db.Store(sym2);
db4o.db.Commit();
매우 간단 지금까지.
"db4o Object Manager Enterprise"로 데이터베이스를 확인하고 두 개의 심볼이 있으며 각 심볼을 클릭하면 각각에 2 일이 포함됩니다. 이제
, 나는 데이터를 꺼내하는 LINQ 쿼리를 수행
이var daysForSymbolS1 = from Symbol s in db4o.db
from TradingDay t in db4o.db
where (s.SymbolGlobal == "IBM"
&& t.Date == new DateTime(2010, 10, 19))
select new
{
s.SymbolGlobal,
t.Date,
t.Meta
};
foreach (var d in daysForSymbolS1)
{
Console.WriteLine("{0} - {1} - {2}", d.SymbolGlobal, d.Date.Date, d.Meta);
}
그리고, 뭔가 이상한 일이 :
IBM - 10/19/2010 12:00:00 AM - SPX meta // This line should not appear because we have specified "IBM" in the filter.
IBM - 10/19/2010 12:00:00 AM - IBM meta
을 나는 그것은 단지에 대한 데이터를 반환해야 함을 지정한다는 사실에도 불구하고 "SPX"는 "IBM"에서 데이터를 반환합니다.
나는 분명히 잘못하고 있습니까?
오류의 원인은 정확합니다. 불행하게도, db4o는 조인을 실제로 지원하지 않습니다. LINQ- 오브젝트로 폴백하고 정확한 해상도를 찾기 위해 전체 데이터베이스를 메모리에로드합니다. LINQ를 포기하고 문제를 해결하기 위해 QBE (Query By Example)를 사용하는 것이 더 좋을 것이라고 생각합니다. – Contango