尝试使用includeProperties调用实体时始终为null

时间:2017-07-31 19:16:03

标签: c# asp.net-mvc entity-framework

我有一个简单的例子:

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,但它总是为null,有人知道那里有什么问题吗?此致

更新

在对var tc = _pService.Listar进行查询后,只需将CatalogosRegistros

的所有内连接值抛出

enter image description here

这是因为我没有CatalogosRegistros_ID我只有一个TipoContenedorID列。为什么EF更改我的ID名称?

因此,如果我更改为TipoContenedorID,我会得到正确的值:

enter image description here

1 个答案:

答案 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();

这种方式如果EstatusCatalogosRegistronull,因为这些表中没有匹配的行,它只会为null提供Nombre }}。如果??NombreEstatus不可为空,则可能必须使用NomberContenedor

就我个人而言,我使用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;
}