4

私の現在のデータベース ソリューションにはEstablishmentFeature、 と呼ばれる 3 つのテーブルと、 と呼ばれる多対多のリンクテーブルが含まれEstablishmentFeatureています (施設には多くの機能があり、機能は複数の施設にまたがって存在する可能性があるため)。

特定の基準のみを満たす施設を返すクエリを生成する必要があります。つまり、渡された featureId のコレクションに基づいて、どの施設が X 機能を持っているかです。AND状態ではありませんOR

私は目的の結果を達成するための SQL を取得しましたが、LINQ (できればランブラ) に相当するものを解決しようとして髪を引っ張っています。T-SQL は次のとおりです。

SELECT e.[EstablishmentId], e.[Name], e.[Description]
FROM Establishment e
INNER JOIN EstablishmentFeature ef
ON e.[EstablishmentId] = ef.[EstablishmentId]
WHERE ef.[FeatureId]  in ('20', '15', '72')
GROUP BY e.[EstablishmentId], e.[Name], e.[Description] 
HAVING COUNT(*) = 3

Linqer を使用して SQL を変換しようとしましたが、変換を試みると Linqer がクラッシュします。Linqer を再インストールしてみましたが、LINQ 構文をコンパイルしようとすると必ずクラッシュします。(ただし、より単純な変換は機能します)。また、LinqPad を使用して LINQ に相当するものを解決しようとしましたが、結局は尻尾を追いかけてしまいました...

これはPredicateBuilderを使用する必要がありますか? 私を逃れている簡単な解決策がある場合、私は PredicateBuilder の学習曲線を通過したくありません。

4

1 に答える 1

4

私はこれを試してみます(すべての指定されたIDに対して、この指定されたIDを持つ(=少なくとも1つの)機能があります):

var establishments = context.Establishments
    .Where(e => featureIds.All(fid => e.Features.Any(f => f.FeatureId == fid)))
    .ToList();

(featureIdsは、IEnumerable<int>検索対象の ID を持つ です。)

于 2013-09-11T17:44:26.847 に答える