linq select中的相关数据

时间:2014-02-06 16:39:42

标签: c# linq windows-phone-8

我需要从相关的不同表格中选择数据,我有医院餐桌,另一个专业和其他服务,以及选择所有医院及其专业和服务的方法,有一种方法可以在linq中做到这一点吗?

这就是我正在尝试的

var hospitalesQuery = from hospital in App.ViewModel.ChristusDB.Hospitales
                                          where hospital.id_tipo == "2" && hospital.christus == "1"
                                          orderby hospital.distancia ascending
                                          from e in App.ViewModel.ChristusDB.EspHosp
                                          where e.fk_hospital==hospital.pk_hospital
                                          from s in App.ViewModel.ChristusDB.ServHosp
                                          where s.fk_hospital==hospital.pk_hospital
                                          select new Hospitale()
                                {
                                    pk_hospital = hospital.pk_hospital,
                                    nombre = hospital.nombre,
                                    direccion = hospital.direccion,
                                    ciudad = hospital.ciudad,
                                    id_ciudad = hospital.id_ciudad,
                                    estado = hospital.estado,
                                    id_estado = hospital.id_estado,
                                    id_tipo = hospital.id_tipo,
                                    tipo_descripcion = hospital.tipo_descripcion,
                                    imagen = hospital.imagen,
                                    gps_lat = hospital.gps_lat,
                                    gps_lng = hospital.gps_lng,
                                    abierto_lv = hospital.abierto_lv,
                                    abierto_sd = hospital.abierto_sd,
                                    telefono_1 = hospital.telefono_1,
                                    telefono_2 = hospital.telefono_2,
                                    telefono_3 = hospital.telefono_3,
                                    telefono_4 = hospital.telefono_4,
                                    telefono_5 = hospital.telefono_5,
                                    inactivo = hospital.inactivo,
                                    christus = hospital.christus,
                                    especialidades= new List<Especialidade>(e),
                                    servicios= new List<Servicio>(s)
                                };

1 个答案:

答案 0 :(得分:1)

您正在寻找通过外键加入表格。 LINQ(asn SQL也为此提供join

from hospital in App.ViewModel.ChristusDB.Hospitales
where hospital.id_tipo == "2" && hospital.christus == "1"
join e in App.ViewModel.ChristusDB.EspHosp on hospital.pk_hospital equals e.fk_hospital
join s in App.ViewModel.ChristusDB.ServHosp on hospital.pk_hospital on s.fk_hospital
orderby hospital.distancia ascending
select new Hospitale()
{...

更新。如果您想为每家医院加载列表依赖项,我认为您不能在EF中使用一个查询来执行此操作。这是尽可能接近:

var hospitals = (from hospital in App.ViewModel.ChristusDB.Hospitales
    where hospital.id_tipo == "2" && hospital.christus == "1"
    orderby hospital.distancia ascending
    select new Hospitale()
    {
        pk_hospital = hospital.pk_hospital,
        ...
    }).ToList();

foreach (var h in hospitals)
{
    h.especialidades = App.ViewModel.ChristusDB.EspHosp.Where(e => e.fk_hospital==h.pk_hospital).ToList();
    h.servicios = App.ViewModel.ChristusDB.ServHosp.Where(e => s.fk_hospital==h.pk_hospital).ToList();
}

然而,这会对DB进行大量查询,这可能会表现不佳。您应该考虑正确地重新设计EF数据模型,以便框架完成为您加载依赖项的工作。