У меня есть требование загрузить сложный объект с именем Node... ну его не такой сложный... он выглядит следующим образом: -
A Node имеет ссылку на EntityType, у которого есть один ко многим с Свойством, который, в свою очередь, имеет от одного до многих с PorpertyListValue
public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new List<Property>();
}
}
public class Property
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType EntityType
{
get;
set;
}
public virtual IList<PropertyListValue> ListValues
{
get;
protected set;
}
public virtual string DefaultValue
{
get;
set;
}
public Property()
{
ListValues = new List<PropertyListValue>();
}
}
public class PropertyListValue
{
public virtual int Id
{
get;
set;
}
public virtual Property Property
{
get;
set;
}
public virtual string Value
{
get;
set;
}
protected PropertyListValue()
{
}
}
Я пытаюсь загрузить объект Node со всеми дочерними объектами одновременно. Нет ленивой нагрузки. Причина в том, что у меня есть тысячи объектов Node в базе данных, и я должен отправить их по проводу с помощью службы WCF. Я столкнулся с проблемами SQL N + 1 классов. Я использую Fluent Nhibernate с Automapping и NHibernate Profiler, предложив мне использовать FetchMode.Eager для загрузки всех объектов одновременно. Я использую следующий qyuery
Session.CreateCriteria(typeof (Node))
.SetFetchMode( "Etype", FetchMode.Join )
.SetFetchMode( "Etype.Properties", FetchMode.Join )
.SetFetchMode( "Etype.Properties.ListValues", FetchMode.Join )
ИЛИ используя NHibernate LINQ
Session.Linq<NodeType>()
.Expand( "Etype")
.Expand( "Etype.Properties" )
.Expand( "Etype.Properties.ListValues" )
Когда я запускаю любой из вышеуказанных запросов, они генерируют один и тот же единственный запрос со всеми левыми внешними соединениями, что мне и нужно. Однако по какой-то причине возврат запроса ILIS из запроса не загружается в объекты. Infact возвращаемое количество узлов равно количеству строк запроса, поэтому объекты Nodes повторяются. Кроме того, свойства внутри каждого Node повторяются, а также значения Listvalues.
Итак, я хотел бы знать, как изменить указанный выше запрос, чтобы вернуть все уникальные узлы со свойствами и значениями в них.
Спасибо Набиль