我定义了此查询以返回IEnumerable<Estructura>
(from d in db.Direccion
where d.Activo == true
select new Estructura()
{
IdEstructura = d.IdDireccion,
Descripcion = d.Descripcion,
IdPadre = 0,
lstEstructurasHijos = d.Cliente.Select(C => new Estructura()
{
IdEstructura = C.IdCliente,
Descripcion = C.Descripcion,
IdPadre = C.IdDireccion,
lstEstructurasHijos = C.Campana.Select(Ca => new Estructura()
{
IdEstructura = Ca.IdCampana,
Descripcion = Ca.Descripcion,
IdPadre = Ca.IdCliente,
lstEstructurasHijos = Ca.Servicio.Select(S => new Estructura()
{
IdEstructura = S.IdServicio,
Descripcion = S.Descripcion,
IdPadre = S.IdCampana,
lstEstructurasHijos = new HashSet<Estructura>()
})
})
})
} into query
select query);
这与班级相关
public class Estructura
{
public Estructura()
{
this.lstEstructurasHijos = new HashSet<Estructura>();
}
public int IdEstructura { get; set; }
public int IdPadre { get; set; }
public string Descripcion { get; set; }
public IEnumerable<Estructura> lstEstructurasHijos { get;set;}
}
它会抛出此错误
System.NotSupportedException
:类型“Estructura
”出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中。可以在同一查询中的两个位置初始化类型,但前提是在两个位置都设置了相同的属性,并且这些属性的设置顺序相同。
为什么我做错了?因为如果我删除每个元素的实例Estructura并让匿名类型linq运行良好
更新
所以,我在查询中做了一些更改,但我现在发现了这个错误
无法创建“
System.Collections.Generic.IEnumerable
1”。在此上下文中仅允许原语('como Int32,String y Guid')
如何为此hashset
Ienumerable
答案 0 :(得分:1)
看起来实体框架很难将您的查询转换为可以在商店执行的内容(在数据库服务器上,我猜)。 EF很好但在这种翻译方面并不完美;有时它需要得到一些帮助。
在这里,我认为我们可以实现您想要的目标:
这样的事情:
var data =
db.Direccion
.Include("Cliente.Campana.Servicio")
.Where(d => d.Activo)
.ToList();
Include
确保在此查询中检索所有相关子实体,而不是根据需要延迟检索。 ToList
强制要求对查询进行评估,并将data
作为内存 List<Direccion>
。
然后我们就可以了
var enumerable =
(from d in data
select new Estructura
{
// etc as your original statement
将由标准的linq-to-objects进行评估,这对您的层次结构构造没有问题。
答案 1 :(得分:0)
您可以使用类似
的内容var q = (from d in db.Direccion
where d.Activo == true
select new
{
IdEstructura = d.IdDireccion,
Descripcion = d.Descripcion,
IdPadre = 0,
lstEstructurasHijos = d.Cliente.Select(C => new
{
IdEstructura = C.IdCliente,
Descripcion = C.Descripcion,
IdPadre = C.IdDireccion,
lstEstructurasHijos = C.Campana.Select(Ca => new
{
IdEstructura = Ca.IdCampana,
Descripcion = Ca.Descripcion,
IdPadre = Ca.IdCliente,
lstEstructurasHijos = Ca.Servicio.Select(S => new
{
IdEstructura = S.IdServicio,
Descripcion = S.Descripcion,
IdPadre = S.IdCampana
})
})
})
} into query
select query).ToList();
var result = q.Select(d=>new Estructura
{
IdEstructura = d.IdEstructura,
Descripcion = d.Descripcion,
IdPadre = d.IdPadre,
lstEstructurasHijos = d.Cliente.Select(C => new Estructura
{
IdEstructura = C.IdEstructura,
Descripcion = C.Descripcion,
IdPadre = C.IdPadre,
lstEstructurasHijos = C.Campana.Select(Ca => new Estructura
{
IdEstructura = Ca.IdEstructura,
Descripcion = Ca.Descripcion,
IdPadre = Ca.IdPadre,
lstEstructurasHijos = Ca.Servicio.Select(S => new Estructura
{
IdEstructura = S.IdEstructura,
Descripcion = S.Descripcion,
IdPadre = S.IdPadre
})
})
})
}
这对我有用
如何为此Ienumerable定义默认的空哈希集?
只需从查询中删除lstEstructurasHijos = new HashSet<Estructura>()
并允许构造函数初始化空列表
public class Estructura
{
public Estructura()
{
//!!!
this.lstEstructurasHijos = new HashSet<Estructura>();
}
//...
}