1

LEFT JOIN を含むこの SQL と同じ結果を返す EF (4.1) クエリを作成する正しい方法が見つかりません。

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 ドメインであり、サービスの無効性を示すもう 1 つのフィールドがあります。

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

Try this:

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
};

ServiceDisponibleXUe( imo の方がわかりやすい複数形を使わずにはいられませんでした)。

于 2012-11-23T21:28:49.203 に答える