linq error为哈希集定义了默认值
本文关键字:默认值 定义 哈希集 error linq | 更新日期: 2023-09-27 18:21:15
I定义此查询以返回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"。在此上下文中只允许基元('mo Int32,String y Guid')
如何为该Ienumerable
定义默认的空hashset
实体框架似乎在将查询转换为可以在商店执行的东西时遇到了问题(我猜是在数据库服务器上)。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对对象进行评估,这不会对层次结构产生问题。
您可以使用类似的东西
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>();
}
//...
}