2017-07-31 63 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