我找不到构建EF(4.1)查询的正确方法,该查询将返回与包含LEFT JOIN的SQL相同的结果:
SELECT
s.id_service,
s.description,
x.id_service as isDisponible
FROM
role.service_disponible s
LEFT JOIN
role.service_disponible_x_ue x
ON s.id_service = x.id_service AND x.id_ue = 1 and flg_actif = '1'
实际上我只是想获取一个完整的服务列表(ServiceDisponible),添加一个字段,告诉我服务是否对某个特定实体是不可取的(用id_ue过滤)哪些信息来自多对多相关table(ServiceDisponibleXUe)。
我的模特是:
理想情况下,我希望此查询返回此viewModel对象,该对象基本上是我的serviceDisponible域,另外还有一个字段指示服务的可用性。
public ServiceDisponibleViewModel(ServiceDisponible ServiceDisponible, bool isDisponible)
{
this.serviceDisponible = serviceDisponible;
this.isDisponible = isDisponible;
}
到目前为止,我的查询是查询,但语法无效:
services = context.ServiceDisponible
.Select(a => new ServiceDisponibleViewModel
{
c => new ServiceDisponible
{
id_service = a.id_service,
description = a.description
},
isDisponible = a.ServiceDisponibleXUe
.Any(b => b.flg_actif && b.id_ue == idUe)
}).ToList();
答案 0 :(得分:1)
试试这个:
ServiceDisponibleViewModel services =
from sd in context.ServiceDisponible
from sdx in context.ServiceDisponibleXUe
.Where(x => x.id_ue == 1 && flg_actif == '1' && x.id_service == sd.id_service)
.DefaultIfEmpty()
select new ServiceDisponibleViewModel(
new ServiceDisponible
{
id_service = sd.id_service,
description = sd.description
},
sdx.id_service
);
答案 1 :(得分:0)
以SQL为例,经常会跳转到linq中的连接。但是使用导航属性会产生更简洁的语法:
from sd in context.ServiceDisponible
from sdx in sd.ServiceDisponibleXUes.Where(x => x.id_ue == 1
&& x.flg_actif == "1")
.DefaultIfEmpty()
select new
{ sd.id_service,
sd.description,
isDisponible = sdx.id_service
};
(我无法使用复数形式的ServiceDisponibleXUe
,其中imo更清晰。)