我有一个简单的例子:
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
我使用了Estatus
和CatalogoRegistro
表。
因此,当我调用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,但它总是为null,有人知道那里有什么问题吗?此致
更新
在对var tc = _pService.Listar
进行查询后,只需将CatalogosRegistros
这是因为我没有CatalogosRegistros_ID
我只有一个TipoContenedorID
列。为什么EF更改我的ID名称?
因此,如果我更改为TipoContenedorID
,我会得到正确的值:
答案 0 :(得分:0)
由于您没有通过过滤器或订单到Listar
,您甚至不需要它。
var tiposcargas = _pService.Select(item => new VehiculoGetViewModel()
{
ID = item.ID,
Nombre = item.Nombre,
NombreEstatus = item.Estatus.Nombre,
NombreContenedor = item.CatalogosRegistro.Nombre
}).ToList();
这种方式如果Estatus
或CatalogosRegistro
为null
,因为这些表中没有匹配的行,它只会为null
提供Nombre
}}。如果??
和NombreEstatus
不可为空,则可能必须使用NomberContenedor
。
就我个人而言,我使用Include
和AsEnumerable
并且只返回结果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;
}