查询EF以使用自定义实体<t>从外键获取值

时间:2017-07-24 15:27:49

标签: sql asp.net-mvc entity-framework

我是使用EF的新手,我不知道如何解决一个简单的选择,我有两种实体类型,如:

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

  T Cargar(Expression<Func<T, bool>> filter,
            string includeProperties = "");

我有两张桌子

Estatus表:

+----+----------+
| ID | Nombre   | 
+----+----------+
| 1  | ACTIVE   |
+----+----------+
| 2  | DISABLED |
+----+----------+

Tipos Carga表:

+----+--------+--------------+-----------+
| ID | Nombre | Descripcion  | EstatusID | 
+----+--------+--------------+-----------+
| 1  | store  | description1 | 2         |  
+----+--------+--------------+-----------+
| 2  | oxo    | description2 | 2         | 
+----+--------+--------------+-----------+

我得到的价值如下:

     var tc = _tipoCargaService.Listar(c => c.EstatusID.Equals(estatusid));
 List<TipoCargaViewModel> tiposcargas = new List<TipoCargaViewModel>();

                    foreach (var item in tc)
                    {
                        var carga = new TipoCargaViewModel()
                        {
                            ID =  item.ID,
                            Nombre = item.Nombre,
                            Descripcion = item.Descripcion,
                            EstatusID = item.EstatusID
                        };
                        tiposcargas.Add(carga);
                    }

我想要做的是获取Estatus表的值Nombre,其中表Carga的EstatusID等于表Estatus的ID

首先,我尝试获取carga表的所有值,如:

 var cargatc = _tipoCargaService.Listar().ToList();

然后调用estatus:

var estatus = _estatusService.Cargar(x => x.Nombre.Where(ID == cargatc.EstatusID));

但我不能等于Nombre.Where(ID == cargatc.EstatusID)

我得到Cannot resolve symbol ID并标记为红色,cargatc.EstatusID相同。此致

2 个答案:

答案 0 :(得分:1)

您已经通过includeProperties param将功能融入到您的方法中,至少看似这样。您需要做的就是在那里添加您的相关实体:

var tc = _tipoCargaService.Listar(c => c.EstatusID.Equals(estatusid), includeProperties: "Estatus");

然后:

var carga = new TipoCargaViewModel()
{
    ID =  item.ID,
    Nombre = item.Estatus.Nombre,
    Descripcion = item.Descripcion,
    EstatusID = item.EstatusID
};

这当然要求您在TiposCarga实体类上拥有导航属性:

public Estatus Estatus { get; set; }

答案 1 :(得分:1)

除非我误解了你的问题,否则你真的不需要虚拟机,你需要确保你的导航属性完好无损,这将使你的生活更轻松。

  1. 验证您的导航属性是否已在EF中正确设置:

    public class Estatus
    {
        public int ID { get; set; }
        public String Nombre { get; set; }
        public virtual ICollection<TipoCarga> TipoCargas { get; set; }
    }
    
    public class TipoCarga
    {
        public int ID { get; set; }
        public String Nombre { get; set; }
        public String Descripcion { get; set; }
        public virtual Estatus Estatus { get; set; }
    }
    
  2. 使用Include关键字在选择时加载对象和链接对象,以便它们包含在返回中。如果不这样做,延迟加载将生效,并且不会加载链接对象(在数据上下文之外尝试访问链接对象属性时会出错):

    public List<TipoCarga> GetWhatever(int estatusid)
    {
        using (DB context = new DB())
        {
            return context.TipoCargas.Include("Estatus").Where(a => a.Estatus.ID == estatusid).ToList();
        }
    }
    
  3. enter image description here