2

カスケードする一連のドロップダウンリストがありますが、ユーザーの選択に応じてリストオプションがリストから除外される代わりに、リスト内の無関係なオプションが無効になります。それらはドロップダウンリストに引き続き表示されますが、グレー表示され、ユーザーはそれらを選択できず、送信に含まれません。

これは、リストオプションと、ユーザーの現在の選択に適用できるリストオプションのサブセットとの間の左結合を使用して実現します。メインリストのメンバーがサブセットから欠落している場合、それはnullを返し、そのオプションが無効になるかどうかを示すブール値を提供する場合があります。

OptionA、OptionB、OptionCの3つのテーブルに関連付けられた3つのカスケードドロップダウンリストがあるとします。vwOptionIndexは、現在使用されているOptionA、OptionB、およびOptionCのすべての組み合わせにインデックスを付けるビューであり、カスケードに適用可能なサブセットを提供します。

ユーザーがOptionB(123、456)で2つの値を選択し、OptionC(789)で1つの値を選択した場合、OptionAのリストを返すには、次のSQLServerクエリを使用します。

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]

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

0

私はそれを理解したと信じています。

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 = g.Count( t => t.ID == null) > 0 }

うまくいけば、これは他の誰かを助けるでしょう。

于 2011-10-04T21:39:14.877 に答える
0

は実際には必要ありませんSum。グループにnullでない値があるかどうかを確認するだけで済みます。

from t1 in OptionAs
join t2 in VwOptionIndex
on new { t1.ID} equals new { t2.OptionA_ID } into t3
from t2 in t3.DefaultIfEmpty()
group t1 by new { t1.ID, t1.Label } into g
select new 
{ 
   g.Key.ID, 
   g.Key.Label, 
   Disabled = g.Any (x => x.OptionA_ID.HasValue)
}
于 2011-10-04T21:19:28.930 に答える