1

我找不到构建 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 过滤),该信息来自多对多相关表(ServiceDisponibleXUe )。

我的模型是:

在此处输入图像描述

理想情况下,我希望这个查询返回这个 viewModel 对象,它基本上是我的 serviceDisponible 域,还有一个字段指示服务的 disponibility。

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();
4

2 回答 2

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
        );
于 2012-11-23T19:37:50.823 回答
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
};

(我忍不住使用了ServiceDisponibleXUeimo 更清楚的复数形式)。

于 2012-11-23T21:28:49.203 回答