As the first one, take a look in the following code:
class Address
{
public Address(string streetName)
{
StreetName = streetName;
}
public string StreetName { get; set; }
public override string ToString()
{
return "Address: " + StreetName;
}
}
class Person
{
public Person(string name, Address address)
{
Name = name;
_address = address;
}
public Address Address
{
get { return _address; }
set { _address = value; }
}
public string Name { get; set;}
public override string ToString()
{
return "Person: " + Name;
}
private Address _address;
}
using (var db = Db4oEmbedded.OpenFile(databaseFileName))
{
db.Store(new Person("Adriano", new Address("You know where I live")));
db.Store(new Person("Sulivan", new Address("Monstropolis")));
db.Store(new Person("Mike", new Address("Who cares?")));
db.Store(new Address("Foo address"));
IQuery q = db.Query();
q.Constrain(typeof(Person));
IQuery descendantQuery = q.Descend("_address");
foreach(var result in descendantQuery.Execute())
{
Console.WriteLine(result);
}
}
What do you think will be the result?
Well, it will return all addresses objects that have a Person as a parent, i.e, "foo address" will not be retrieved/shown!
You can even specify constrains in both queries (getting the addresses for persons with a specific name!).
Note that this does not work for fields with value type semantics (basically any primitive value, enums [in .Net], string, etc.).
Do you have any db4o topic that, in your opinion, is commonly misunderstood and you would like to discuss? Please, let us know :)
Have fun!
Adriano