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

linq error为哈希集定义了默认值

实体框架似乎在将查询转换为可以在商店执行的东西时遇到了问题(我猜是在数据库服务器上)。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>();
    }
    //...
 }