一連のドロップダウンリストがカスケード表示されていますが、ユーザーの選択に応じてリストオプションから除外されるリストオプションの代わりに、それらはまだドロップダウンリストに存在していますが、グレー表示されているため、ユーザーは選択できず、送信には含まれません。LINQでラムダ式を使用したドロップダウンリストの一覧表示
これは、リストオプションと、ユーザーの現在の選択に適用可能なリストオプションのサブセットの間で左結合を使用して行います。メインリストのメンバーがサブセットにない場合、nullが返され、そのオプションが無効になるかどうかを示すbooleanを提供することができます。
3つのカスケードドロップダウンリストがOptionA、OptionB、OptionCの3つのテーブルに関連付けられているとします。 vwOptionIndexは、現在使用されているOptionA、OptionBおよびOptionCのすべての組み合わせを索引付けし、カスケードに適用可能なサブセットを提供するビューです。
OptionB(123,456)の2つの値とOptionC(789)の1つの値を選択した場合、OptionAのリストを返すには、次のSQL Serverクエリを使用します。
SELECT
a.ID,
a.Label,
CAST(
CASE
WHEN SUM(
CASE
WHEN x.OptionA_ID IS NULL
THEN 0
ELSE 1
END
) > 0
THEN 0
ELSE 1
END AS BIT
) AS [Disabled]
FROM dbo.OptionA AS a
LEFT OUTER JOIN dbo.vwOptionIndex AS x
ON a.ID = x.OptionA_ID
AND OptionB_ID IN (123, 456)
AND OptionC_ID IN (789)
GROUP BY a.ID, a.Label
私はこのクエリをLINQで表現しようとしています。私は結合を把握しましたが、リストのオプションを無効にする必要があるかどうかを示すビットを返すクエリの部分をどのように表現するのか把握できませんでした。
from t1 in OptionAs
join t2 in VwOptionIndex
on new { t1.ID} equals new { t2.OptionA_ID } into j1
from j2 in j1.DefaultIfEmpty()
group j2 by new { t1.ID, t1.Label } into g
select new { g.Key.ID, g.Key.Label, Disabled = <???> }
つまり、上記のLINQクエリ式では、次のビットのロジックが必要です。
CAST(CASE WHEN SUM(CASE WHEN x.OptionA_ID IS NULL THEN 0 ELSE 1 END) > 0 THEN 0 ELSE 1 END AS BIT) AS [Disabled]
ご協力いただければ幸いです。
ありがとうございます!
Magnus、あなたのバージョンが優れています!ありがとう! – Kuyenda
HasValueは、タイプINTのOptionA_IDで動作しません。 – Kuyenda
左結合を行っているので、おそらくxがnullでないかどうかのチェックが必要です – Magnus