У меня есть требование загрузить сложный объект с именем Узел ... ну, это не так сложно ... это выглядит следующим образом: -
A Узел имеет ссылку на 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. Я столкнулся с проблемой классов N + 1 SQL. Я использую 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" )
Когда я запускаю любой из вышеприведенных запросов, они оба генерируют один и тот же одиночный запрос со всеми левыми внешними объединениями, что мне и нужно. Однако по какой-то причине возвращаемый IList из запроса не является загружаемым свойством в объекты. На самом деле количество возвращаемых узлов равно количеству строк запроса, поэтому объекты узлов повторяются. Более того, свойства в каждом узле повторяются, как и значения списков.
Поэтому я хотел бы знать, как изменить приведенный выше запрос, чтобы он возвращал все уникальные узлы со свойствами и значениями списка в них.
Спасибо
Набиль