使用LINQ查询db4o中的嵌套类?
遇到db4o和简单嵌套结构的棘手问题 问题:当我使用LINQ从db4o中提取数据时,它提取了太多的数据(即“where”子句似乎不起作用) 我有一些嵌套对象:使用LINQ查询db4o中的嵌套类?,linq,linq-to-objects,db4o,Linq,Linq To Objects,Db4o,遇到db4o和简单嵌套结构的棘手问题 问题:当我使用LINQ从db4o中提取数据时,它提取了太多的数据(即“where”子句似乎不起作用) 我有一些嵌套对象: Root ----Symbol (SPX) | |------Day 1: Date: 2010-10-18, string "SPX meta" | |------Day 2: Date: 2010-10-19, string "SPX 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"
我创建了两个符号:
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");
然后,我为每个符号分配几天:
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对象管理器企业”检查数据库,果然有两个符号,如果单击每个符号,每个符号都包含两天
现在,我执行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”返回数据
我有什么明显的错误吗?您没有发布类的确切定义,但您目前正在Linq查询中执行一项操作-您正在创建每一个可能的组合,而您实际上只希望“匹配”组合(因为您的模式中的交易日出于某种原因似乎与符号关联)。您应该做的是加入,类似于:
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))
...
错误的原因完全正确。不幸的是,db4o并不真正支持连接,因为它使用LINQ访问对象,并将整个数据库加载到内存中,以尝试找到正确的解决方案。我认为最好放弃LINQ,使用QBE(示例查询)来解决这个问题。