需要帮助使用LEFT JOIN构建EF查询

时间:2012-11-23 17:16:26

标签: asp.net-mvc entity-framework

我找不到构建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)。

我的模特是:

enter image description here

理想情况下,我希望此查询返回此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();

2 个答案:

答案 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更清晰。)