我是使用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
相同。此致
答案 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)
除非我误解了你的问题,否则你真的不需要虚拟机,你需要确保你的导航属性完好无损,这将使你的生活更轻松。
验证您的导航属性是否已在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; }
}
使用Include关键字在选择时加载对象和链接对象,以便它们包含在返回中。如果不这样做,延迟加载将生效,并且不会加载链接对象(在数据上下文之外尝试访问链接对象属性时会出错):
public List<TipoCarga> GetWhatever(int estatusid)
{
using (DB context = new DB())
{
return context.TipoCargas.Include("Estatus").Where(a => a.Estatus.ID == estatusid).ToList();
}
}