linq error为hashset定义的默认值

时间:2012-01-25 00:16:55

标签: c# linq entity-framework

我定义了此查询以返回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

2 个答案:

答案 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>();
    }
    //...
 }
相关问题