2011-02-23 7 views
0

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"에서 데이터를 반환합니다.

나는 분명히 잘못하고 있습니까?

답변

1

정확한 클래스 정의를 게시하지 않았지만 현재 Linq 쿼리에서 cartesian product을 수행하고 있습니다. 가능한 모든 조합을 만드는 반면, 실제로는 "일치하는"조합 만 필요합니다 (스키마의 거래 일 이후 웬일인지 상징과 관련이있는 것처럼 보인다). 대신 다음과 같이 참여해야합니다.

from TradingDay t in db4o.db 
    join Symbol s in db4o.db 
    on s.SymbolGlobal equals t.SymbolGlobal 
    where (s.SymbolGlobal == "IBM" 
     && t.Date == new DateTime(2010, 10, 19)) 
    ... 
+0

오류의 원인은 정확합니다. 불행하게도, db4o는 조인을 실제로 지원하지 않습니다. LINQ- 오브젝트로 폴백하고 정확한 해상도를 찾기 위해 전체 데이터베이스를 메모리에로드합니다. LINQ를 포기하고 문제를 해결하기 위해 QBE (Query By Example)를 사용하는 것이 더 좋을 것이라고 생각합니다. – Contango

관련 문제