2017-07-31 65 views
0

调用实体时,总是得到空我有一个简单的得到这样的:尝试使用includeProperties

var tc = _pService.Listar(includeProperties: "Estatus,CatalogosRegistro"); 

if (tc != null) 
{ 
    List<VehiculoGetViewModel> tiposcargas = new List<VehiculoGetViewModel>(); 

    foreach (var item in tc) 
    { 
     var carga = new VehiculoGetViewModel() 
     { 
      ID = item.ID, 
      Nombre = item.Nombre, 
      NombreEstatus = item.Estatus.Nombre, 
      NombreContenedor = item.CatalogosRegistro.Nombre 
     }; 

     tiposcargas.Add(carga); 
    } 
} 

正如你可以看到我有includeProperties,我使用EstatusCatalogoRegistro表。

所以,当我打电话NombreEstatus = item.Estatus.Nombre,item.Estatus.Nombre获得价值正常,但item.CatalogosRegistro总是空

视图模型:

public class VehiculoGetViewModel 
{ 
    public Int64 ID { get; set; } 
    public string Nombre { get; set; } 
    public string NombreEstatus { get; set; } 
    public Estatus Estatus { get; set; } 
    public string NombreContenedor { get; set; } 
    public CatalogoRegistro CatalogosRegistro { get; set; } 
} 

型号

[Table("TiposVehiculo", Schema="adm")] 
public class TipoVehiculo: Entidad<Int32> 
{ 
    [StringLength(255)] 
    public string Nombre { get; set; } 
    [StringLength(255)] 
    public int EstatusID { get; set; } 
    public Estatus Estatus { get; set; } 
    public CatalogoRegistro CatalogosRegistro { get; set; } 
} 

Listar实现通货膨胀:

public virtual IEnumerable<T> Listar(
      Expression<Func<T, bool>> filter = null, 
      Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
      string includeProperties = "") 
     { 
      IQueryable<T> query = _dbset; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      { 
       query = query.Include(includeProperty); 
      } 

      if (orderBy != null) 
      { 
       return orderBy(query).AsEnumerable<T>(); 
      } 
      else 
      { 
       return query.AsEnumerable<T>(); 
      } 
     } 

奇怪的是我不具备使用Estatus任何问题,我用相同的结构来调用CatalogoRegistro但它总是空,可有些人知道什么是错的呢?问候

更新:

checing的var tc = _pService.Listar查询后,只扔内的所有值与CatalogosRegistros

enter image description here

加入。那是因为我不具备CatalogosRegistros_ID我只是有一个TipoContenedorID列。为什么EF更改我的ID的名字?

所以,如果我改变TipoContenedorID我得到正确的价值观:

enter image description here

+0

'Listar'?在哪里实施? – juharr

+0

对不起,我用'Listar()'实现更新我的问题@juharr – Ledwing

+0

你的问题很可能是从IQueryable到IEnumerable的转换,其中,IIRC执行查询并将结果存储在内存中 –

回答

0

既然你不给Listar通过过滤器或为了你并不真的甚至需要它。

var tiposcargas = _pService.Select(item => new VehiculoGetViewModel() 
    { 
     ID = item.ID, 
     Nombre = item.Nombre, 
     NombreEstatus = item.Estatus.Nombre, 
     NombreContenedor = item.CatalogosRegistro.Nombre 
    }).ToList(); 

这样,如果EstatusCatalogosRegistronull因为没有匹配的行中的那些表将只是给你nullNombre。如果NombreEstatusNomberContenedor不能为空,则可能必须使用??

个人而言,我就把你使用IncludeAsEnumerable和,只是返回结果IQueryable,让来电者应对自己的选择Includes或者只是使用的导航性能。

public virtual IQueryable<T> Listar(
     Expression<Func<T, bool>> filter = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,) 
{ 
    IQueryable<T> query = _dbset; 

    if (filter != null) 
    { 
     query = query.Where(filter); 
    } 

    if (orderBy != null) 
    { 
     return orderBy(query); 
    } 

    return query; 
} 
+0

我检查你的答案,但我不能对我的实体做出重大改变,这是一个很大的应用程序,所以如果我改变它,所有运行方法都会停止,那么没有其他形式可以解决这个问题了吗?这是无法打电话给两个属性? – Ledwing

+0

这是一样的,如果我只调用CatalogosRegistros像'_pService.Listar(includeProperties:“CatalogosRegistro”);'它只是抛出null,就像调用模型的东西是错误的 – Ledwing

+0

如果你决定继续使用'Listar'作为这是你需要处理的可能性,你包含的导航属性可以像这样'null' NombreContenedor = item.CatalogosRegistro?.Nombre ?? 0'或者如果你没有C#6那么'NombreContenedor = item.CatalogosRegistro == null? 0:item.CatalogosRegistro.Nombre' – juharr